从std :: wstring转换为LPBYTE

时间:2014-01-13 08:54:33

标签: c++

我有一个没有MFC支持的MS VC ++程序。 (这就是使用std :: wstring而不是CString的原因。)
我正在使用这种方法将数据流式传输到richedit中:

DWORD __stdcall MEditStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    std::wstring *wsBuffer = (std::wstring *)dwCookie;
    cb = wsBuffer->length();

    for (int i = 0; i < cb; i++)
        *(pbBuff+i) = wsBuffer->c_str()[i];

    *pcb = cb;
    return 0;
}

它有点工作,但我不喜欢使用 for 循环转换字符的手动方式。
是否有任何功能可以更有效地执行此转换?

2 个答案:

答案 0 :(得分:1)

您可以使用类似WideCharToMultiByte的内容。

DWORD __stdcall MEditStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    std::wstring *wsBuffer = (std::wstring *) dwCookie;    
    *pcb = WideCharToMultiByte(CP_ACP, 0, wsBuffer->c_str(), wsBuffer->length(), pbBuff, cb, "?", NULL);
    return 0;
}

您可以根据需要微调转换参数。

答案 1 :(得分:0)

似乎你必须填充缓冲区pbBuff并且没有选择而不是复制字符串,所以:

for (int i = 0; i < cb; i++)
    *(pbBuff+i) = wsBuffer->c_str()[i];

*pcb = cb;

相当于

cb = min(cb, wsBuffer->length());
CopyMemory(pbBuff, &wsBuffer[0], cb * sizeof(wchar_t));
*pcb = cb;

顺便说一句,使用DWORD来存储指针只适用于32位Windows,请记住。