你如何将std :: string转换为BSTR *?

时间:2015-07-09 10:00:29

标签: c++ winapi bstr

您如何将std::string转换为BSTR*

STDMETHODIMP CMyRESTApp::rest(BSTR data, BSTR* restr)
{
    RESTClient restclient;
    RESTClient::response resp = restclient.get(data);

    Log("Response Status code: %s", resp.code);
    Log("Response Body: %s", resp.body);

    *restr = // here
    return S_OK;
}

我需要转换resp.body,然后在此处返回*restr

4 个答案:

答案 0 :(得分:7)

基于ATL的方法是使用ATL::CComBSTR,然后使用Detach()(或CopyTo(...))结果CComBSTRBSTR*

类似的东西:

CComBSTR temp(stlstr.c_str());
*restr = temp.Detach();

另外,对于std::basic_string,您可以使用Win32 API Sys*系列函数,例如SysAllocStringByteLenSysAllocString;

// For the `const char*` data type (`LPCSTR`);
*restr = SysAllocStringByteLen(stlstr.c_str(), stlstr.size());

// More suitable for OLECHAR
*restr = SysAllocString(stlwstr.c_str());

OLECHAR取决于目标平台,但通常为wchar_t

鉴于您的代码,最短的代码段可能就是;

*restr = SysAllocStringByteLen(resp.body.c_str(), resp.body.size());

注意这些Windows API函数使用"通常" Windows代码页转换,如果需要,请参阅MSDN文档,了解如何控制它。

答案 1 :(得分:2)

std::stringchar s制作; BSTR通常是基于Unicode UTF-16 wchar_t的字符串,带有长度前缀。

即使可以使用BSTR作为编组字节数组的简单方法(因为BSTR是长度前缀的,因此它可以存储嵌入的NUL),因此可能是{{ 1}}也可用于存储非UTF-16文本,通常的"自然" BSTR的行为是包含Unicode UTF-16 BSTR - 字符串

所以,第一个问题是澄清 wchar_t使用什么类型的编码(例如:Unicode UTF-8?或其他一些代码页?)。然后你必须将该字符串转换为Unicode UTF-16,并创建一个包含该UTF-16字符串的std::string

要将UTF-8(或其他代码页)转换为UTF-16,您可以使用MultiByteToWideChar() function。如果源BSTR包含UTF-8字符串,则可以将std::string代码页值与上述API一起使用。

获得UTF-16转换后的字符串后,您可以使用它创建CP_UTF8,并将其作为输出BSTR参数传递。

创建BSTR*的主要Win32 API是SysAllocString()。还有一些变体可以指定字符串长度。

或者,作为一种更方便的替代方法,您可以使用ATL的CComBSTR类将BSTR包装在安全的RAII边界中,并使用其Detach() method来传递BSTR作为输出BSTR参数。

BSTR*

奖金阅读:

  

Eric's Complete Guide To BSTR Semantics

答案 2 :(得分:1)

这很有可能:

std::string singer("happy new year 2016");
_bstr_t sa_1(singer.c_str()); //std::string to _bstr_t
_bstr_t sa_2("Goodbye 2015"); 
std::string kapa(sa_2); //_bstr_t to std::string

答案 3 :(得分:0)

size_t sztBuffer = (resp.body.length() + 1) * sizeof(wchar_t);
wchar_t* pBuffer = new wchar_t[resp.body.length() + 1];
ZeroMemory(&pBuffer[0], sztBuffer);
MultiByteToWideChar(CP_ACP, 0, resp.body.c_str(), resp.body.length(), pBuffer, sString.length());    
SysAllocString((OLECHAR*)pBuffer);
delete[] pBuffer;

不要忘记随后解除分配。