C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 87 - BSTR / ActiveX по шагам / Приложение

Шаг 87 - BSTR

В С++ строка это массив символов который заканчивается нулем. К сожалению это не везде так. Например, в PASCAL по другому. Но COM объекты должны быть универсальные и получать и передавать сроки из любых сред разработки. Именно по этому COM реализует свой тип срок который называется базовым - BSTR.

typedef OLECHAR * BSTR;

Эта строка содержит символы UNICODE с префиксом из четырех байт в котором содержится длина. Хоть эта строка и похожа на обычную строку но для работы с ней следует использовать специальные функции. Например, нельзя использовать delete для удаление, или использовать стандартные функции работы со строками C.

Итак, создать строку можно с помощью функции SysAllocString. Удалить распределенную строку можно при помощи функции - SysFreeString. Смотрим пример "Шаг 102 - Функции SysAllocString() и SysFreeString()".

Можно сказать, что BSTR это обычный OLECHAR*. Значит и функции преобразования будут работать, как с OLECHAR смотрим "Шаг 57 - OLECHAR в CHAR и обратно". Определение длины строки несколько опасно. Вообще то это строка которая должна оканчиваться нулем. Но внутри нее могут быть нули и потому для определения длины лучше использовать специальные функции. Для определения длины строки нужно использовать функцию

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);
}

| |
Автор Каев Артем.
[AD]