您如何将 std::string 转换为 BSTR*?
How would you convert a std::string to 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
返回。
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;
不要忘记事后释放它。
基于 ATL 的方法是使用 ATL::CComBSTR
,然后使用 Detach()
(或 CopyTo(...)
)结果 CComBSTR
到 BSTR*
类似于:
CComBSTR temp(stlstr.c_str());
*restr = temp.Detach();
否则,一般来说 std::basic_string
您可以使用 Win32 API Sys*
系列函数,例如 SysAllocStringByteLen
and SysAllocString
;
// 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 函数使用 "usual" windows 代码页转换,请参阅更多 MSDN 文档如果需要如何控制它。
std::string
是由 char
制作的; BSTR
通常是基于 Unicode UTF-16 wchar_t
的字符串,带有长度前缀。
即使可以使用 BSTR
作为编组字节数组的一种简单方法(因为 BSTR
是长度前缀的,所以它可以存储嵌入的 NUL),因此可能BSTR
也可用于存储非 UTF-16 文本,通常 BSTR
的“自然”行为是包含 Unicode UTF-16 wchar_t
-字符串.
所以,第一个问题是弄清楚std::string
使用的是哪种编码(例如:Unicode UTF-8?还是其他一些代码页?) .然后你必须将该字符串转换为 Unicode UTF-16,并创建一个包含该 UTF-16 字符串的 BSTR
。
要从 UTF-8(或其他代码页)转换为 UTF-16,您可以使用 MultiByteToWideChar()
function。如果源 std::string
包含 UTF-8 字符串,您可以将 CP_UTF8
代码页值与上述 API.
一起使用
获得 UTF-16 转换后的字符串后,您可以使用它创建 BSTR
,并将其作为输出 BSTR*
参数传递。
主要的 Win32 API 创建一个 BSTR
是 SysAllocString()
。还有一些变体,您可以在其中指定字符串长度。
或者,作为更方便的替代方法,您可以使用 ATL 的 CComBSTR
class to wrap a BSTR
in safe RAII boundaries, and use its Detach()
method 将 BSTR
作为输出 BSTR*
参数传递。
CComBSTR bstrResult( /* UTF-16 string from std::string */ );
*restr = bstrResult.Detach();
阅读奖励:
这很有可能:
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
如何将 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
返回。
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;
不要忘记事后释放它。
基于 ATL 的方法是使用 ATL::CComBSTR
,然后使用 Detach()
(或 CopyTo(...)
)结果 CComBSTR
到 BSTR*
类似于:
CComBSTR temp(stlstr.c_str());
*restr = temp.Detach();
否则,一般来说 std::basic_string
您可以使用 Win32 API Sys*
系列函数,例如 SysAllocStringByteLen
and SysAllocString
;
// 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 函数使用 "usual" windows 代码页转换,请参阅更多 MSDN 文档如果需要如何控制它。
std::string
是由 char
制作的; BSTR
通常是基于 Unicode UTF-16 wchar_t
的字符串,带有长度前缀。
即使可以使用 BSTR
作为编组字节数组的一种简单方法(因为 BSTR
是长度前缀的,所以它可以存储嵌入的 NUL),因此可能BSTR
也可用于存储非 UTF-16 文本,通常 BSTR
的“自然”行为是包含 Unicode UTF-16 wchar_t
-字符串.
所以,第一个问题是弄清楚std::string
使用的是哪种编码(例如:Unicode UTF-8?还是其他一些代码页?) .然后你必须将该字符串转换为 Unicode UTF-16,并创建一个包含该 UTF-16 字符串的 BSTR
。
要从 UTF-8(或其他代码页)转换为 UTF-16,您可以使用 MultiByteToWideChar()
function。如果源 std::string
包含 UTF-8 字符串,您可以将 CP_UTF8
代码页值与上述 API.
获得 UTF-16 转换后的字符串后,您可以使用它创建 BSTR
,并将其作为输出 BSTR*
参数传递。
主要的 Win32 API 创建一个 BSTR
是 SysAllocString()
。还有一些变体,您可以在其中指定字符串长度。
或者,作为更方便的替代方法,您可以使用 ATL 的 CComBSTR
class to wrap a BSTR
in safe RAII boundaries, and use its Detach()
method 将 BSTR
作为输出 BSTR*
参数传递。
CComBSTR bstrResult( /* UTF-16 string from std::string */ );
*restr = bstrResult.Detach();
阅读奖励:
这很有可能:
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