将char []转换为LPCWSTR

时间:2010-07-12 03:29:18

标签: visual-c++

任何人都可以帮我纠正这段代码:

    char szBuff[64];
    sprintf(szBuff, "%p", m_hWnd);
    MessageBox(NULL, szBuff, L"Test print handler", MB_OK);

错误是,它无法将第二个参数转换为LPCWSTR。

5 个答案:

答案 0 :(得分:9)

对于此特定的案例,修复非常简单:

wchar_t szBuff[64];
swprintf(szBuff, L"%p", m_hWnd);
MessageBox(NULL, szBuff, L"Test print handler", MB_OK);

也就是说,始终使用Unicode字符串。通常,在Windows上编程时,使用wchar_t和UTF-16可能是最简单的。当然,这取决于你必须与其他系统进行多少交互。

对于一般情况,如果您有一个ASCII(或char *)字符串,请使用WideCharToMultiByte作为一般情况,或mbstowcs作为@Matthew指出更简单个案(如果字符串在当前的C语言环境中,则mbstowcs有效)。

答案 1 :(得分:1)

您可能希望查看mbstowcs,它会将传统的“每个字符一个字节”字符串转换为“每个字符多个字节”字符串。

或者,将项目设置更改为使用多字节字符串 - 默认情况下,它们通常是“Unicode”或“宽字符”字符串(我不记得我头顶的确切选项名称)。

答案 2 :(得分:0)

如果您使用UNICODE进行编译,请使用双倍宽度制作所有使用的字符串 - 例如将它们定义为wchar_t*

如果您真的必须将ASCII转换为Unicode,请使用ATL conversion macros

答案 3 :(得分:0)

由于您的标签建议VC ++,我建议使用CString。如果是,那么以下代码片段也适用于您的情况:

CString szBuff;

szBuff.Format(_T("%p"), m_hWnd);
MessageBox(NULL, szBuff, L"Test print handler", MB_OK);

答案 4 :(得分:0)

使用 MultiByteToWideChar()对我有用:

void main(int argc, char* argv[])
{
 ...
 wchar_t filename[4096] = {0};
 MultiByteToWideChar(0, 0, argv[1], strlen(argv[1]), filename, strlen(argv[1]));

 // RenderFile() requires LPCWSTR (or wchar_t*, respectively)
 hr = pGraph->RenderFile(filename, NULL);
 ...
}