2010-07-23 5 views
5

Я пытаюсь преобразовать wchar_t * в BSTR.C++: конвертировать wchar_t * в BSTR?

#include <iostream> 
#include <atlstr.h> 

using namespace std; 

int main() 
{ 
    wchar_t* pwsz = L"foo"; 

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Печатается 0, что меньше, чем я надеялся. Каков правильный способ сделать это преобразование?

ответ

9

Вам нужно использовать SysAllocString (а затем SysFreeString).

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

BSTR представляет собой управляемая строку с символами строки с префиксом их длиной. SysAllocString выделяет правильный объем памяти и правильно определяет длину и содержимое строки. При правильной инициализации BSTRSysStringLen должен вернуть правильную длину.

Если вы используете C++, вам может потребоваться использовать класс стиля RAII (или даже Microsoft _bstr_t), чтобы вы не забыли ни одного звонка SysFreeString.

1

Я думаю, что проще всего либо использовать

CString

или

CComBSTR

оба имеют методы, которые делают то, что Чарльз упомянул

+1

'CString' не _wrap_ a' BSTR', хотя он имеет метод выделения 'BSTR' из' CString' ('.AllocSysString()'). Однако 'CString' не помогает с автоматическим освобождением' BSTR'. –

+0

ну, в некотором смысле, он обертывает функциональность, чтобы преобразовать в BSTR, чего хотел OP, но технически вы правы, поэтому мой выбор слов был неправильным. –

2

SysStringLen() следует использовать только на BSTRs выделенных SysAllocString() функции семьи. Использование его так, как вы это сделаете, приведет к неопределенному поведению - программа может сбой или непредвиденные результаты. Еще лучше использовать классы-обертки - ATL::CComBSTR или _bstr_t.

Смежные вопросы