Преобразовать LPCOLESTR в BSTR?

Любые идеи о том, как сделать BSTR из LPCOLESTR? Глупо зацикливаться..


person Community    schedule 01.08.2009    source источник


Ответы (2)


LPCOLESTR — это просто const wchar_t*, поэтому вы можете использовать SysAllocString() для создания BSTR:

LPCOLESTR olestr = ...;
BSTR bstr = SysAllocString(olestr);

Обязательно вызовите SysFreeString(), когда закончите работу с BSTR. См. также документацию MSDN по BSTRs.

person Adam Rosenfield    schedule 01.08.2009
comment
Обратите внимание, что OLECHAR == wchar_t верно только на платформе Wintel. Не уверен, что были на других платформах, но это было забавно, и на них BSTR, вероятно, тоже просто char *, так что ваш ответ правильный для всех практических целей;) - person peterchen; 02.08.2009

Разница между BSTR и LPCOLESTR заключается в том, что BSTR имеет префикс длины строки перед строкой, а LPCOLESTR — нет.

BSTR не обязательно имеет окончание \0, обозначающее конец строки, поскольку длина строки имеет префикс, для преобразования я обычно использую класс CComBSTR (atlcomcli.h), ctor принимает либо BSTR, либо LPCOLESTR в качестве аргумента, и там является членом BSTR() для получения представления BSTR:

CComBSTR b( yourolestring )
// b.BSTR()

CComBSTR будет обрабатывать выделение/освобождение, поэтому риск утечки памяти исключен.

person AndersK    schedule 02.08.2009