LPCWSTR 到 char*,反之亦然
LPCWSTR to char* and vice versa
我正在使用 DirectX9 开发一个简单的项目。我在一些数据类型的转换上遇到了一些麻烦,我做了一些研究,但没有发现任何特别有用的东西。让我们从代码开始:
LPDIRECT3DSURFACE9 LoadSurface(char *fileName, D3DCOLOR transColor)
{
LPDIRECT3DSURFACE9 image = NULL;
D3DXIMAGE_INFO info;
HRESULT result;
result = D3DXGetImageInfoFromFile(fileName, &info);
if (result != D3D_OK) return NULL;
result = d3ddev->CreateOffscreenPlainSurface(
info.Width, //width of the surface
info.Height, //height of the surface
D3DFMT_X8R8G8B8, //surface format
D3DPOOL_DEFAULT, //memory pool use
&image, //reference to image
NULL); //reserved - ALWAYS NULL
//make sure file loaded properly
if (result != D3D_OK) return NULL;
return image;
}
在第 6 行,我收到变量文件名的错误:
IntelliSense:"char *" 类型的参数与 "LPCWSTR"
类型的参数不兼容
我在尝试使用 MessageBox 时在第二个和第三个参数中也得到了完全相同的错误消息:
if (d3ddev == NULL)
{
MessageBox(hWnd, "Error Creating Direct3D Device", "Error", MB_ICONERROR);
return 0;
}
我以前使用过完全类似的代码,没有遇到任何问题。不知道发生了什么——特别是因为 LPCWSTR 和 char* 本质上是一样的...
感谢任何帮助!!谢谢
I've used code exactly like this before and had no problems.
不,你没有。
LPCWSTR and char* are essentially the same thing...
不,他们不是。
如果您阅读 the documentation,您会发现 LPCWSTR
是 const wchar_t*
。
您应该在函数中使用 const wchar_t*
。
如果您真的想要转换为char*
,并且不介意(至少在两个方向之一)这没有任何意义,那么您可以阅读以下问题的答案:
- Convert char[] to LPCWSTR
- How to convert char* to LPCWSTR?
… 然后应用 const_cast
。但是,说真的,请不要。
您之前没有问题的最可能原因是您在 Visual C++ 项目的设置中打开了 unicode。请在此处查看已接受的答案以再次将其关闭(如果可能的话):
How do I turn off Unicode in a VC++ project?
否则您需要使用 MultiByteToWideChar function.
将 char *
转换为 wchar_t *
通过查看 DirectX 头文件弄清楚了...如果有人遇到同样的问题,而不是使用:
D3DXGetImageInfoFromFile(varName, &info);
改为使用:
D3DXGetImageInfoFromFileA(varName, &info);
同样适用于 MessageBox 的...使用
MessageBoxA(handleVar, messageVar, titleVar, iconType);
*需要注意的是,您的项目 属性 字符集设置已设置为 Unicode。如果将其切换为多字节,则变得不必要。
一如既往,感谢那些真正为此做出贡献并帮助过我的人;不,感谢那些只是 post 在董事会上嘲笑或贬低那些经验不足的人的人 - 充分利用你的时间。
我正在使用 DirectX9 开发一个简单的项目。我在一些数据类型的转换上遇到了一些麻烦,我做了一些研究,但没有发现任何特别有用的东西。让我们从代码开始:
LPDIRECT3DSURFACE9 LoadSurface(char *fileName, D3DCOLOR transColor)
{
LPDIRECT3DSURFACE9 image = NULL;
D3DXIMAGE_INFO info;
HRESULT result;
result = D3DXGetImageInfoFromFile(fileName, &info);
if (result != D3D_OK) return NULL;
result = d3ddev->CreateOffscreenPlainSurface(
info.Width, //width of the surface
info.Height, //height of the surface
D3DFMT_X8R8G8B8, //surface format
D3DPOOL_DEFAULT, //memory pool use
&image, //reference to image
NULL); //reserved - ALWAYS NULL
//make sure file loaded properly
if (result != D3D_OK) return NULL;
return image;
}
在第 6 行,我收到变量文件名的错误:
IntelliSense:"char *" 类型的参数与 "LPCWSTR"
类型的参数不兼容我在尝试使用 MessageBox 时在第二个和第三个参数中也得到了完全相同的错误消息:
if (d3ddev == NULL)
{
MessageBox(hWnd, "Error Creating Direct3D Device", "Error", MB_ICONERROR);
return 0;
}
我以前使用过完全类似的代码,没有遇到任何问题。不知道发生了什么——特别是因为 LPCWSTR 和 char* 本质上是一样的...
感谢任何帮助!!谢谢
I've used code exactly like this before and had no problems.
不,你没有。
LPCWSTR and char* are essentially the same thing...
不,他们不是。
如果您阅读 the documentation,您会发现 LPCWSTR
是 const wchar_t*
。
您应该在函数中使用 const wchar_t*
。
如果您真的想要转换为char*
,并且不介意(至少在两个方向之一)这没有任何意义,那么您可以阅读以下问题的答案:
- Convert char[] to LPCWSTR
- How to convert char* to LPCWSTR?
… 然后应用 const_cast
。但是,说真的,请不要。
您之前没有问题的最可能原因是您在 Visual C++ 项目的设置中打开了 unicode。请在此处查看已接受的答案以再次将其关闭(如果可能的话): How do I turn off Unicode in a VC++ project?
否则您需要使用 MultiByteToWideChar function.
将char *
转换为 wchar_t *
通过查看 DirectX 头文件弄清楚了...如果有人遇到同样的问题,而不是使用:
D3DXGetImageInfoFromFile(varName, &info);
改为使用:
D3DXGetImageInfoFromFileA(varName, &info);
同样适用于 MessageBox 的...使用
MessageBoxA(handleVar, messageVar, titleVar, iconType);
*需要注意的是,您的项目 属性 字符集设置已设置为 Unicode。如果将其切换为多字节,则变得不必要。
一如既往,感谢那些真正为此做出贡献并帮助过我的人;不,感谢那些只是 post 在董事会上嘲笑或贬低那些经验不足的人的人 - 充分利用你的时间。