C ++: преобразовать wchar_t * в BSTR? - PullRequest
5 голосов
/ 24 июля 2010

Я пытаюсь преобразовать 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, что меньше, чем я надеялся.Как правильно сделать это преобразование?

Ответы [ 3 ]

9 голосов
/ 24 июля 2010

Вам необходимо использовать SysAllocString (а затем SysFreeString).

BSTR bstr = SysAllocString(pwsz);

// ...

SysFreeString(bstr);

A BSTR - это управляемая строка с символами строки с префиксом их длины.SysAllocString выделяет правильный объем памяти и правильно устанавливает длину и содержимое строки.Если BSTR правильно инициализирован, SysStringLen должен возвращать правильную длину.

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

2 голосов
/ 26 июля 2010

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

1 голос
/ 24 июля 2010

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

CString

или

CComBSTR

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

...