Реальное BSTR
- это:
- временно выделено из кучи COM (через
SysAllocString()
и семейство)
- структура данных, в которой строковым данным предшествует их длина, сохраненная в 32-битном значении.
- передается как указатель на пятый байт этой структуры данных, в которой находятся строковые данные.
См. Документацию:
MSDN: BSTR
Большинство функций, которые принимают BSTR
, не будут аварийно завершать работу, когда переданный BSTR создает простое назначение. Это приводит к путанице, поскольку люди наблюдают за тем, что кажется рабочим кодом, из которого они делают вывод, что BSTR
может быть инициализирован так же, как и любой WCHAR *
. Это неверный вывод.
Только действительные BSTRs
могут быть переданы в интерфейсы OLE Automation.
Используя конструктор CComBSTR()
, который вызывает SysAllocString()
, ваш код создаст настоящий BSTR
. Деструктор CComBSTR()
позаботится о возврате выделенного хранилища в систему через SysFreeString()
.
Если вы передаете CComBSTR()
API, который становится владельцем, обязательно вызовите метод .Detach()
, чтобы убедиться, что BSTR
не освобожден. BSTRs
равны , а не ссылка считается (в отличие от объектов COM, которые есть), и поэтому попытка освободить BSTR
более одного раза приведет к краху.