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,您会发现 LPCWSTRconst 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 在董事会上嘲笑或贬低那些经验不足的人的人 - 充分利用你的时间。