В С++ строка это массив символов который заканчивается нулем. К сожалению это не везде так. Например, в PASCAL по другому. Но COM объекты должны быть универсальные и получать и передавать сроки из любых сред разработки. Именно по этому COM реализует свой тип срок который называется базовым - BSTR.
typedef OLECHAR * BSTR;
Эта строка содержит символы UNICODE с префиксом из четырех байт в котором содержится длина. Хоть эта строка и похожа на обычную строку но для работы с ней следует использовать специальные функции. Например, нельзя использовать delete для удаление, или использовать стандартные функции работы со строками C.
Итак, создать строку можно с помощью функции SysAllocString. Удалить распределенную строку можно при помощи функции - SysFreeString. Смотрим пример "Шаг 102 - Функции SysAllocString() и SysFreeString()".
Можно сказать, что BSTR это обычный OLECHAR*. Значит и функции преобразования будут работать, как с OLECHAR смотрим "Шаг 57 - Функции ShowWindow() и UpdateWindow()". Определение длины строки несколько опасно. Вообще то это строка которая должна оканчиваться нулем. Но внутри нее могут быть нули и потому для определения длины лучше использовать специальные функции. Для определения длины строки нужно использовать функцию
UINT SysStringLen ( BSTR bstr );
Вот так например.
void main() { BSTR bstr=SysAllocString(L"new string"); cout << SysStringLen(bstr) << endl; SysFreeString(bstr); }
В данному случае длина строки вернется 10 символов. Для замены строки нужно применять функцию
INT SysReAllocString ( BSTR FAR* pbstr, const OLECHAR FAR* psz );
Вот так например.
void main() { BSTR bstr=SysAllocString(L"new string"); SysReAllocString(&bstr,L"Hello"); cout << SysStringLen(bstr) << endl; SysFreeString(bstr); }
Но использование BSTR типа чревато ошибками, так как при использовании стандартных функций работ со строками могут быть ошибки. Код ниже прекрасно компилируется, но его выполнение приводит к ошибке доступа.
void main() { BSTR bstr=SysAllocString(L"test"); wcscpy(bstr,L"test test test"); SysFreeString(bstr); }