LPCWSTR到char *,反之亦然

时间:2016-09-27 19:10:32

标签: c++ char type-conversion directx-9 lpcwstr

我正在使用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行,我收到了变量fileName的错误:

IntelliSense:类型" char *"的参数与" LPCWSTR"

类型的参数不兼容

在尝试使用MessageBox时,我在第二个和第三个参数上也得到完全相同的错误消息:

if (d3ddev == NULL)
{
MessageBox(hWnd, "Error Creating Direct3D Device", "Error", MB_ICONERROR);
return 0;
}

我之前使用的代码完全相同,没有问题。不知道发生了什么 - 特别是因为LPCWSTR和char *本质上是一样的......

任何帮助表示赞赏!!谢谢

3 个答案:

答案 0 :(得分:4)

之前没有问题的最可能原因是您在Visual C ++项目的设置中打开了unicode。请在此处查看已接受的答案以将其关闭(如果可能的话): How do I turn off Unicode in a VC++ project?

否则,您需要使用MultiByteToWideChar functionchar *转换为wchar_t *

答案 1 :(得分:3)

  

我之前使用的代码完全相同,没有任何问题。

不,你没有。

  

LPCWSTR和char *本质上是一样的......

不,他们不是。

如果您阅读the documentation,则会发现LPCWSTRconst wchar_t*

您应该将const wchar_t*改为您的功能。

如果真的想要转换为char*,并且不介意(至少在两个方向中的一个方向)这没有任何意义,那么你可以阅读以下问题的答案:

...然后申请const_cast。但是,说真的,请不要。

答案 2 :(得分:1)

通过查看DirectX头文件来计算出来...如果有人遇到同样的问题,而不是使用:

D3DXGetImageInfoFromFile(varName, &info);

相反,请使用:

D3DXGetImageInfoFromFileA(varName, &info);

MessageBox'同样如此......使用

MessageBoxA(handleVar, messageVar, titleVar, iconType);    

*需要注意的是,字符集的项目属性设置设置为Unicode。如果将其切换为多字节,则不需要。

一如既往,感谢那些真正贡献并帮助我的人;并且感谢那些只是在董事会上发帖嘲笑或贬低那些经验不足的人 - 充分利用你的时间。