Где документируется использование нулевого BSTR? - PullRequest
5 голосов
/ 06 мая 2009

По крайней мере, обычной практикой является обработка нулевого BSTR (нулевого указателя WCHAR *) как пустой строки и создание соответствующего кода, управляющего BSTR. Ответы на этот вопрос говорят то же самое.

Где документирована эта практика? Есть ли официальный документ, описывающий эту конвенцию?

Ответы [ 3 ]

6 голосов
/ 06 мая 2009

Ну, ссылка, приведенная в принятом ответе на этот вопрос, относится к статье Эрика Липперта, Полное руководство Эрика по семантике BSTR . Хотя это определенно будет , а не официальной документацией, Липперт является хорошо известным специалистом по COM (особенно в области сценариев).

Однако, официальная документация гласит:

BSTR без элементов данных является либо пустым BSTR, либо пустым BSTR. Пустой BSTR указывает текущее, но нулевое значение данных. NULL BSTR указывает значение данных, которое отсутствует.

Итак, официально они оба BSTR s без элементов данных, но с немного отличающейся семантикой (хотя нет ничего, чтобы сказать, что эти 2 случая должны обрабатываться по-разному в вашем приложении). В этом случае я бы, конечно, следовал совету Липперта относиться к ним одинаково. Для меня его реальный опыт работы с реальными реализациями имеет больший вес, чем одно предложение в официальном документе BSTR.

4 голосов
/ 06 мая 2009

Майкл Барр дает то, что я считаю приемлемым ответом. К сожалению, страница для BSTR в MSDN не документирует эту практику.

Кроме того, вы можете вывести это поведение из следующих страниц документации MSDN:

  • SysFreeString страница сообщает, что если bstr равно null, функция просто возвращается.
  • SysStringLen страница сообщает, что передача null для параметра bstr возвращает ноль для длины строки.
  • SysStringByteLen страница сообщает об аналогичном поведении; null означает нулевую длину.

Однако, документация не полная:

  • SysReAllocString не упоминает, что произойдет, если *pbstr будет null.
  • SysReAllocStringLen не упоминает, что произойдет, если *pbstr равно null.
1 голос
/ 03 мая 2018

Обработка нулевого BSTR как пустой строки выглядит обычной практикой, но техническая документация, найденная в Microsoft, фактически утверждает, что - это разница между этими двумя.

Для любого документа, ссылающегося на [MS-DTYP] и [MS-OAUT], указав BSTR в контексте представления проводов ДОЛЖЕН рассматриваться как ссылка на переданный тип BSTR, при этом указав BSTR в контекст представления памяти ДОЛЖЕН рассматриваться как ссылка на представлен тип BSTR (раздел MS.5 [MS-DTYP]). Отражая терминология, используемая для представленных BSTR, NULL BSTR или NULL, переданных BSTR, определяется как проводное представление NST-представленного BSTR; и пустой BSTR, или пустой переданный BSTR, определяется как провод представление нулевой длины представлено BSTR. Сохранение этого Различие в представлении проводов позволяет клиентам и серверам различать представленные значения NULL и BSTR нулевой длины BSTR и, следовательно, связывают, возможно, разные, специфичные для приложения семантика к этим двум значениям.

https://msdn.microsoft.com/en-us/library/cc237580.aspx

Так что реализация зависит от того, обрабатывают ли они оба одинаково или нет.

...