0

我正在使用 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* 本质上是同一件事......

任何帮助表示赞赏!谢谢

4

3 回答 3

5

您之前没有问题的最可能原因是您在 Visual C++ 项目的设置中打开了 unicode。请参阅此处接受的答案以再次将其关闭(如果可能的话): 如何在 VC++ 项目中关闭 Unicode?

否则,您需要转换char *wchar_t *使用MultiByteToWideChar 函数

于 2016-09-27T19:18:24.140 回答
3

我以前使用过完全一样的代码并且没有问题。

不,你没有。

LPCWSTR 和 char* 本质上是一回事......

不,他们不是。

如果您阅读文档,您会发现 aLPCWSTR是 a const wchar_t*

您应该将 aconst wchar_t*纳入您的功能。

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

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

于 2016-09-27T19:14:11.427 回答
1

通过查看 DirectX 头文件弄清楚了...如果有人遇到同样的问题,而不是使用:

D3DXGetImageInfoFromFile(varName, &info);

相反,使用:

D3DXGetImageInfoFromFileA(varName, &info);

MessageBox 的...使用也是如此

MessageBoxA(handleVar, messageVar, titleVar, iconType);    

*这附带一个警告,您的项目属性设置的字符集设置为 Unicode。如果将其切换为多字节,则没有必要。

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

于 2016-09-27T19:22:23.257 回答