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?

¿Fue útil?

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 si bstr es nulo , la función simplemente regresa.
  • SysStringLen la página informa que pasar un nulo para el parámetro bstr 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:

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top