Страница 11 из 111 Функции, работающие со строками Для работы со строками, которые выделяет один компонент, а освобождает другой, Автоматизация определяет специальный набор функций. Эти функции используют следующий тип данных: typedef OLECHAR FAR* BSTR;
Эти строки заканчиваются нулем, и в большинстве случаев их можно рассматривать как обычные строки OLECHAR*. Однако длину BSTR можно узнать, не сканируя ее, так что внутри BSTR могут содержаться нулевые символы. Длина хранится как целое, расположенное непосредственно перед данными строки. Вместо непосредственного обращения по этому адресу приложениям для доступа к длине BSTR следует использовать соответствующие функции. В тех случаях, когда BSTR не транслируется из ANSI в Unicode или наоборот, Вы можете использовать ее для передачи двоичных данных. Например, если код будет работать только в 16-разрядных системах и взаимодействовать только с другими 16-разрядными системами, BSTR можно использовать для двоичных данных. Для передачи двоичных данных рекомендуется использовать SAFEARRAY типа VT_UI1. В 32-разрядной OLE BSTR, как и другие строки, использует Unicode. В 16-разрядной OLE строки BSTR используют ANSI. Для преобразования строк ANSI в Unicode Win32 предоставляет функцию MultiByteToWideChar (и функцию WideCharToMultiByte для обратного преобразования). Автоматизация кэширует пространство, выделяемое для BSTR. Это ускоряет работу последовательностей вызовов SysAllocString/SysFreeString. Однако, так как IMallocSpy ничего не знает о таком кэшировании, то он может неверно выдавать информацию о месте утечки памяти. Например, если приложение выделяет BSTR и затем освобождает ее, Автоматизация помещает свободный блок памяти в кэш. Если далее приложение выделяет новую BSTR, то оно может выделить свободный блок из кэша. Если вторая BSTR не освобождается, IMallocSpy будет связывать утечку памяти с выделением первой BSTR. Для определения истинного источника утечки (второе выделение) Вы можете отключить кэширование, используя отладочную версию Oleaut32.dll и установив перед запуском приложения переменную среды OANOCACHE=1. Пустой указатель допустим как значение переменной BSTR. По соглашению он всегда рассматривается так же, как указатель на BSTR, содержащую 0 символов. Также по соглашению в вызовах функций, которым BSTR передаются по ссылке, должен задаваться либо нулевой указатель, либо указатель на выделенную BSTR. Если реализация такой функции присваивает параметру BSTR новое значение, она обязана освободить переданную ей BSTR. |