Где задокументировано использование null BSTR?

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

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


person sharptooth    schedule 06.05.2009    source источник


Ответы (3)


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

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

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

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

person Michael Burr    schedule 06.05.2009
comment
Я не был архитектором VBScript ни де-юре, ни де-факто; Я был разработчиком в команде сценариев и реализовал многие функции в VBScript, но я определенно не был на уровне архитектора. - person Eric Lippert; 10.06.2009
comment
Эрик - Я удалил эту часть. Извините за ошибку (надеюсь, вы воспримете это как комплимент). - person Michael Burr; 11.06.2009

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

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

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

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

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

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

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

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

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

person niks    schedule 03.05.2018