Windows函数中的char *或LPCWSTR

时间:2013-05-31 17:12:28

标签: c++ windows char directx

我遵循了使用标准windows.h标题创建Windows窗口的教程。

WNDCLASSEX wc;
...
ec.lpszClassName = applicationName;

首先编译时,applicationName是一个char *,一切都很好,但现在我需要重新创建项目(顺便说一下MSVC ++),当我试图编译它时,它需要是一个LPCWSTR。我偶然发现了很多,想知道,为什么它有时接受char *,有时候不接受!?我在项目设置中遗漏了什么吗?

顺便说一下:

会发生同样的事情
D3DX11CreateShaderResourceViewFromFile(d3ddevice, filename, NULL, NULL, &m_texture, NULL);

其中filename一旦接受char *但不再接受...

2 个答案:

答案 0 :(得分:3)

在“Configuration Properties-> General”下的项目设置中,有一个名为“Character Set”的选项。将其设置为“使用Unicode字符集”将导致许多Windows API函数接受wchar_t*而不是char*。如果设置为“使用多字节字符集”,则API函数将采用char*而不是wchar_t*

答案 1 :(得分:3)

MSVC项目具有“Unicode”属性,您可以打开或关闭它。当它关闭时,所有Win32函数都使用char作为基本字符类型(因此期望传递字符串的函数将需要`const char *)。

启用后,wchar_t是使用的字符类型。 (因此函数使用const wchar_t*作为字符串参数。)

API实际上定义了两个结构WNDCLASSEXAWNDCLASSEXW。前者使用char,后者使用wchar_t

取决于是否启用了Unicode(定义了_UNICODE预处理器宏),其中一个名称为WNDCLASSEX

因此,启用Unicode时,WNDCLASSEX实际上意味着WNDCLASSEXW

对于处理字符数据的API中的所有其他函数和类型也是如此。他们都有_A_W变体

如果您不想依赖项目属性设置,可以明确指出要使用的变体:

创建WNDCLASSEX始终使用WNDCLASSEXW),而不是创建wchar_t(可以是两个不同的东西)。而不是致电RegisterClass,请致电RegisterClassARegisterClassW