簡體   English   中英

你如何將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

基於ATL的方法是使用ATL::CComBSTR ,然后使用Detach() (或CopyTo(...) )將得到的CComBSTR發送到BSTR*

就像是:

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文檔,了解如何控制它。

std::stringchar s生成; BSTR通常是基於Unicode UTF-16 wchar_t的字符串,具有長度前綴。

即使可以使用BSTR作為編組字節數組的簡單方法(因為BSTR是長度前綴的,因此它可以存儲嵌入的NUL),因此BSTR也可能用於存儲非UTF-16文本, BSTR通常的“自然”行為是包含Unicode UTF-16 wchar_t -string

所以,第一個問題是澄清std::string使用什么樣的編碼 (例如:Unicode UTF-8?或其他一些代碼頁?)。 然后,您必須將該字符串轉換為Unicode UTF-16,並創建包含該UTF-16字符串的BSTR

要從UTF-8(或其他代碼頁)轉換為UTF-16,您可以使用MultiByteToWideChar()函數 如果源std::string包含UTF-8字符串,則可以將CP_UTF8代碼頁值與上述API一起使用。

獲得UTF-16轉換后的字符串后,可以使用它創建BSTR ,並將其作為輸出BSTR*參數傳遞。

創建BSTR的主要Win32 API是SysAllocString() 還有一些變體可以指定字符串長度。

或者,作為一種更方便的替代方法,您可以使用ATL的CComBSTR類將BSTR包裝在安全的RAII邊界中,並使用其Detach()方法BSTR作為輸出BSTR*參數傳遞。

CComBSTR bstrResult( /* UTF-16 string from std::string */ );
*restr = bstrResult.Detach();

獎金閱讀:

Eric的BSTR語義完全指南

這很有可能:

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
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;

不要忘記之后解除分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM