2014-01-13 43 views
0

我有一个没有MFC支持的MS VC++程序。 (这就是为什么的std :: wstring的,而不是CString的使用。)
我用这个方法流数据成的richedit:从std :: wstring到LPBYTE的转换

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

这多少作品,但我不喜欢将字符转换的手工方式使用作为循环。
是否有任何功能可以以更有效的方式执行此转换?

+0

你的循环看起来不错。只要确保明白你不改变编码 - 你只需将字符串作为字节数组复制即可。你也可以写''LPBYTE pbBuff =(LPBYTE)&wsBuffer [0];' – Henno

+0

我将宽字符串复制到一个字节数组,所以上面的类型转换将不起作用) - : – user681768917

+1

你可以使用WideCharToMultiByte '实际上正确地将宽字符串转换为适当的编码。 – dreamlax

回答

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

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

+0

是的,这是我正在寻找的。有用。只要pbBuff必须像(LPSTR)pbBuff那样类型化,并且如果要更正它,则会出现拼写错误“1c_str() - 谢谢。 – user681768917

0

看来你必须填充缓冲pbBuff并没有的choise不是复制字符串,因此:

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。

+0

谢谢,但没有。首先,小解决你的解决方案:min(cb,wsBuffer-> length());.其次,它不会做转换 - 之后的pbBuff会有垃圾。最后,我正在使用64位Windows。你的意思是它只能用于程序的32位编译。 – user681768917

+0

感谢您的纠正,我编辑了我的答案。你能解释为什么它不起作用吗? –

+0

它只是复制内存。它不执行从两字节字符到单字节字符的转换。 – user681768917

相关问题