Wo wird mit null BSTR dokumentiert?
-
06-07-2019 - |
Frage
Es ist zumindest gängige Praxis null BSTR (null WCHAR * Zeiger) als eine leere Zeichenfolge zu behandeln und Design aller Code Manipulation BSTRs entsprechend. Antworten auf diese Frage sagen das gleiche.
Wo ist diese Praxis dokumentiert? Gibt es ein offizielles Dokument beschreibt diese Konvention?
Lösung
Nun, da der Link in der akzeptierten Antwort auf diese Frage ist zu einem Artikel von Eric Lippert, Erics Complete Guide To BSTR Semantics . Während es würde auf jeden Fall nicht offizielle Dokumentation sein, ist Lippert eine bekannte Autorität auf COM (insbesondere in der Scripting-Arena).
Allerdings die offizielle Dokumentation dies zu sagen hat:
A BSTR ohne Datenelemente entweder ein leerer BSTR oder eine NULL BSTR. Ein leerer BSTR zeigt eine vorhanden, aber die Länge Null, Datenwert. Ein NULL BSTR zeigt einen Datenwert, der nicht vorhanden ist.
Also, offiziell sind sie beide BSTR
s ohne Datenelemente, aber mit leicht unterschiedlicher Semantik (obwohl es gibt nichts zu sagen, dass diese zwei Fälle behandelt werden müssen, unterschiedlich in Ihrer Anwendung). In diesem Fall würde ich folgen sicherlich Lippert Rat sie gleich zu behandeln. Für mich seine praktische Erfahrung mit, wie tatsächliche Implementierungen Arbeit mehr Gewicht als der Satz in dem offiziell BSTR Dok.
Andere Tipps
Michael Burr gibt, was ich denke, sollte die akzeptierte Antwort sein. Es ist bedauerlich, dass die Seite für BSTR
in MSDN dies nicht dokumentieren Praxis.
Darüber hinaus können Sie dieses Verhalten von diesen Seiten in der MSDN-Dokumentation entnehmen:
-
SysFreeString
Seite berichtet, dass, wennbstr
ist die Funktion einfachnull
kehrt zurück. -
SysStringLen
Seite berichtet, dass einenull
für denbstr
Parameter übergeben gibt Null für die String-Länge. -
SysStringByteLen
Seite meldet das gleiche Verhalten;null
bedeutet die Länge Null.
Allerdings ist die Dokumentation nicht vollständig:
-
SysReAllocString
erwähnt nicht, was passieren wird, wenn*pbstr
null
ist . -
SysReAllocStringLen
erwähnt nicht, was passieren wird, wenn*pbstr
null
ist .
Umgang mit null BSTR als leere Zeichenfolge Nähte eine gängige Praxis zu sein, aber die technische Dokumentation bei Microsoft tatsächlich festgestellt, heißt es, dass es ist ein Unterschied zwischen diesen beiden.
Für jedes Dokument verweist sowohl [MS-DTYP] und [MS-OAUT] unter Angabe BSTR in einem Draht Darstellung Zusammenhang muß als in Betracht gezogen werden Bezug auf die BSTR-Typ übertragen werden, während die Angabe BSTR in a Speicherrepräsentation Zusammenhang ist als Bezugnahme auf das in Betracht gezogen werden, präsentiert BSTR-Typ ([MS-DTYP] Abschnitt 2.2.5). reflektierende der Terminologie dargestellt BSTRs, eine NULL BSTR verwendet oder übertragen NULL BSTR, wird als die Draht Darstellung eines NULL definiert BSTR dargestellt; und eine leere BSTR oder leer BSTR übertragen wird, wenn der Draht definiert Darstellung einer Null-Länge dargestellt BSTR. Die Erhaltung dieser Unterscheidung in der Draht Darstellung ermöglicht Clients und Servern unterscheiden zwischen NULL präsentiert BSTRs und Null-Länge präsentiert BSTRs und assoziiert damit möglicherweise unterschiedliche, anwendungsspezifische Semantik zu diesen beiden Werten.
https://msdn.microsoft.com/en-us/library /cc237580.aspx
So ist es bis zu den Implementierungen ist, ob sie beide gleich behandeln oder nicht.