【问题标题】:LPCWSTR to char* and vice versaLPCWSTR 到 char* 反之亦然
【发布时间】:2017-02-05 13:13:18
【问题描述】:

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

任何帮助表示赞赏!谢谢

【问题讨论】:

  • LPCSTR 和 char* 我可能同意,但 LPCWSTR?没有。
  • 不知道发生了什么——尤其是因为 LPCWSTR 和 char 本质上是一回事。* -- 不,它们不是跨度>
  • This Q/A 可能会回答您的问题。 (查看第二个答案,更改项目配置,使 API 不需要 unicode)。
  • 现代 C++ 应用程序都使用 Unicode(又名宽字符或 wchar_t)。旧 ANSI (ASCII) 接口仍然存在,但可以追溯到 Windows 3.x。实际上,您仍然会故意选择 ANSI API 的唯一情况是用于调试输出(因为它从未本地化),例如 OutputDebugStringA。在包含任何标题之前使用#define _UNICODE#define UNICODE
  • 说到“现代 C++”,您为什么使用旧版 Direct3D 9 和已弃用的 D3DX 库而不是 Direct3D 11?见MSDNLiving without D3DX

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我以前使用过完全一样的代码,没有任何问题。

    不,你没有。

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

    不,他们不是。

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

    您应该将const wchar_t* 改为您的函数。

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

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

    【讨论】:

      【解决方案3】:

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

      D3DXGetImageInfoFromFile(varName, &info);
      

      改为使用:

      D3DXGetImageInfoFromFileA(varName, &info);
      

      MessageBox 的...使用也是如此

      MessageBoxA(handleVar, messageVar, titleVar, iconType);    
      

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

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

      【讨论】:

      • 是的,这行得通,但这是个坏主意。更改项目设置,以便使用 char API。 (D3DXGetImageInfoFromFile 是一个宏,可以解析为D3DXGetImageInfoFromFileWD3DXGetImageInfoFromFileA,具体取决于UNICODE
      • 我认为您应该在此答案中添加为什么要明确使用 Win32 API 的 xyzA 窄版本而不是宽版本或已发布和记录的名称。
      • 正如有人指出的那样,我完全忽略了,项目设置设置为 Unicode 而不是多字节。原谅我 - 我使用 DirectX 已经快一年了……我仍然记得我必须在设置中进行的所有小调整。菜鸟失误。谢谢大家的帮助!!
      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2013-02-11
      • 2014-12-04
      • 2014-11-08
      相关资源
      最近更新 更多