我有一个没有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 循环转换字符的手动方式。
是否有任何功能可以更有效地执行此转换?
答案 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,请记住。