Sollte es einen Unterschied zwischen einem leeren BSTR und einem NULL BSTR geben?

8

Wenn eine COM Schnittstelle gepflegt wird, sollte eine leere BSTR genauso behandelt werden wie NULL ? Mit anderen Worten, sollten diese beiden Funktionsaufrufe das gleiche Ergebnis liefern?

%Vor%     
Motti 05.10.2008, 07:45
quelle

2 Antworten

13

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.

    
1800 INFORMATION 05.10.2008, 07:50
quelle
4

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.

    
HS. 05.10.2008 10:55
quelle

Tags und Links