Шаг 87 - BSTR

В С++ строка это массив символов который заканчивается нулем. К сожалению это не везде так. Например, в 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);
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 14.07.2001