2

我遵循了有关使用标准 windows.h 标头创建 Windows - Window 的教程。

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

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

顺便说一句:同样的事情发生在

D3DX11CreateShaderResourceViewFromFile(d3ddevice, filename, NULL, NULL, &m_texture, NULL);

文件名曾经接受 char* 但不再接受...

4

2 回答 2

3

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

于 2013-05-31T17:16:40.130 回答
3

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

启用时,wchar_t是使用的字符类型。(所以函数const wchar_t*用于字符串参数)。

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

根据是否启用 Unicode(它定义了一个_UNICODE预处理器宏),其中之一是 name 的别名WNDCLASSEX

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

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

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

与其创建一个WNDCLASSEX(可以是两个不同的东西),不如创建一个WNDCLASSEXW总是使用wchar_t)。而不是调用RegisterClass,调用RegisterClassARegisterClassW

于 2013-05-31T17:17:18.210 回答