2009-05-06 2 views
5

Это, по крайней мере, обычная практика для обработки нулевого BSTR (нулевого указателя WCHAR *) в виде пустой строки и проектирования всех кодов, управляющих BSTR соответственно. Ответы на this question говорят то же самое.Где используется нулевой BSTR?

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

ответ

5

Ну, ссылка, приведенная в принятом ответе на этот вопрос, относится к статье Эрика Липперта, Eric's Complete Guide To BSTR Semantics. Хотя это определенно не быть официальной документацией, Lippert - это хорошо известный авторитет на COM (особенно в сценарии).

Однако the official documentation это сказать:

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

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

+0

Я не был архитектором VBScript, де-юре или де-факто; Я был разработчиком команды сценариев и реализовал множество функций в VBScript, но я, конечно, не был на уровне архитекторов. –

+0

Эрик - я удалил этот бит. Извините за ошибку (надеюсь, вы примете это как комплимент). –

4

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

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

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

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

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