Где задокументировано использование null BSTR?
-
06-07-2019 - |
Вопрос
По крайней мере, обычной практикой является обработка 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 р>
Так что реализация зависит от того, обрабатывают ли они оба одинаково или нет. Р>