Ja - ein NULL BSTR ist identisch mit einem leeren. Ich erinnere mich daran, dass wir alle möglichen Fehler hatten, die beim Wechsel von VS6 nach 2003 aufgedeckt wurden - die CComBSTR-Klasse hatte eine Änderung am Standardkonstruktor, der sie mit NULL anstelle einer leeren Zeichenfolge zugewiesen hat. Dies passiert, wenn Sie zum Beispiel einen BSTR als reguläre C-Stil-Zeichenfolge behandeln und ihn an eine Funktion wie strlen
weitergeben, oder versuchen, eine std::string
damit zu initialisieren.
Eric Lippert diskutiert BSTR's sehr ausführlich in Erics Complete Guide To BSTR Semantics :
Lassen Sie mich zuerst die Unterschiede auflisten und dann diskutiere jeden Punkt in Quälendes Detail.
1) Ein BSTR muss identisch sein Semantik für NULL und für "". Ein PWSZ hat häufig unterschiedliche Semantiken für diese.
2) Ein BSTR muss zugewiesen und freigegeben werden mit der SysAlloc * -Familie von Funktionen. Ein PWSZ kann ein automatischer Speicherpuffer von der stack oder zugeordnet mit malloc, neu, LocalAlloc oder ein anderer Speicher Zuweiser.
3) Ein BSTR hat eine feste Länge. Ein PWSZ kann von beliebiger Länge sein, nur begrenzt durch die Menge des gültigen Speichers in seiner Puffer.
4) Ein BSTR zeigt immer auf den ersten gültiges Zeichen im Puffer. Ein PWSZ kann ein Zeiger auf die Mitte oder das Ende sein eines String-Puffers.
5) Bei der Zuweisung eines n-Byte-BSTR Sie Platz für n / 2 Zeichen haben. Wenn Sie n Bytes für eine PWSZ zuweisen Sie können n / 2 - 1 Zeichen speichern - Sie müssen Platz für die Null lassen.
6) Ein BSTR kann beliebige Unicode-Daten enthalten einschließlich des Nullzeichens. Ein PWSZ enthält niemals das Nullzeichen außer als Marker am Ende der Kette. Sowohl ein BSTR als auch ein PWSZ haben immer ein null Zeichen nach dem letzten gültigen Charakter, aber in einem BSTR ein gültiger Zeichen kann ein Nullzeichen sein.
7) Ein BSTR kann tatsächlich eine ungerade enthalten Anzahl der Bytes - es kann für verwendet werden binäre Daten verschieben. Ein PWSZ ist fast immer eine gerade Anzahl von Bytes und nur zum Speichern von Unicode verwendet Zeichenfolgen.
Der einfachste Weg, um mit diesem Dilemma umzugehen, ist die Verwendung von CComBSTR und die Überprüfung von .Length () auf Null. Dies funktioniert sowohl für leere als auch für NULL-Werte.
Beachten Sie jedoch, dass das leere BSTR freigegeben werden muss oder dass ein Speicherleck auftritt. Ich habe einige davon kürzlich im Code anderer gesehen. Ziemlich schwer zu finden, wenn Sie nicht genau hinsehen.