¿Dónde se documenta el uso de BSTR nulo?
-
06-07-2019 - |
Pregunta
Es al menos una práctica común tratar el BSTR nulo (puntero WCHAR * nulo) como una cadena vacía y diseñar todo el código que manipula los BSTR en consecuencia. Respuestas a esta pregunta decir lo mismo.
¿Dónde se documenta esta práctica? ¿Hay algún documento oficial que describa esta convención?
Solución
Bueno, el enlace que figura en la respuesta aceptada a esa pregunta es un artículo de Eric Lippert, Guía completa de Eric para la semántica BSTR . Si bien definitivamente no sería documentación oficial, Lippert es una autoridad bien conocida en COM (particularmente en el área de scripting).
Sin embargo, la documentación oficial dice lo siguiente:
Un BSTR sin elementos de datos es un BSTR vacío o un BSTR NULO. Un BSTR vacío indica un valor de datos presente, pero de longitud cero. Un BSTR NULO indica un valor de datos que no está presente.
Entonces, oficialmente, ambos son BSTR
s sin elementos de datos, pero con una semántica ligeramente diferente (aunque no hay nada que decir que esos 2 casos deben manejarse de manera diferente en su aplicación). En este caso, ciertamente seguiría los consejos de Lippert de tratarlos de manera idéntica. Para mí, su experiencia en el mundo real sobre cómo funcionan las implementaciones reales tiene más peso que la frase en el documento oficial BSTR.
Otros consejos
Michael Burr da lo que creo que debería ser la respuesta aceptada. Es lamentable que la página para BSTR
en MSDN no documenta esta práctica.
Además, puede inferir este comportamiento de estas páginas en la documentación de MSDN:
-
SysFreeString
la página informa que sibstr
esnulo
, la función simplemente regresa. -
SysStringLen
la página informa que pasar unnulo
para el parámetrobstr
devuelve cero para la longitud de la cadena. -
SysStringByteLen
la página informa la mismo comportamiento;null
significa longitud cero.
Sin embargo, la documentación no está completa:
-
SysReAllocString
no menciona ¿Qué pasará si* pbstr
esnulo
. -
SysReAllocStringLen
no menciona ¿Qué pasará si* pbstr
esnulo
.
El manejo de BSTR nulo como costuras de cadena vacías es una práctica común, pero la documentación técnica que se encuentra en Microsoft en realidad establece que hay una diferencia entre esos dos.
Para cualquier documento que haga referencia a [MS-DTYP] y [MS-OAUT], especificando BSTR en un contexto de representación de cable DEBE considerarse como un referencia al tipo de BSTR transmitido, mientras se especifica BSTR en un el contexto de representación de memoria DEBE considerarse como una referencia a la tipo BSTR presentado ([MS-DTYP] sección 2.2.5). Reflejando el Terminología utilizada para los BSTR presentados, un BSTR NULO o NULL transmitido BSTR, se define como la representación de cable de un BSTR presentado NULL; y un BSTR vacío, o BSTR transmitido vacío, se define como el cable representación de un BSTR presentado de longitud cero. Preservar esto La distinción en la representación por cable permite a los clientes y servidores Distinguir entre BSTR presentados NULL y presentados de longitud cero BSTR y, por lo tanto, asocian posiblemente diferentes aplicaciones específicas semántica a estos dos valores.
https://msdn.microsoft.com/en-us/library /cc237580.aspx
Entonces, depende de las implementaciones si manejan ambos iguales o no.