Вопрос

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

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

Это было полезно?

Решение

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

Однако официальная документация содержит следующее:

  

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

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

Другие советы

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

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

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

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

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

Обработка пустого 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top