我遵循了使用标准windows.h头文件创建Windows - Window的教程。
WNDCLASSEX wc;
...
ec.lpszClassName = applicationName;
刚开始编译这段代码时,applicationName是一个char*,一切都很好,但现在我需要重新创建项目(顺便说一句,是MSVC++),当我试图编译它时,它需要是一个LPCWSTR。我偶然发现了这一点,我很想知道,为什么它有时接受char,有时不接受!?我的项目设置中是否遗漏了什么?
顺便说一下:同样的事情也会发生在
D3DX11CreateShaderResourceViewFromFile(d3ddevice, filename, NULL, NULL, &m_texture, NULL);
filename曾经接受char*,但现在不接受了...
发布于 2013-05-31 17:16:40
在项目设置的“配置属性->常规”下,有一个名为“字符集”的选项。将其设置为"Use Unicode Character Set“将导致许多Windows API函数接受wchar_t*
而不是char*
。如果设置为“使用多字节字符集”,则API函数将使用char*
而不是wchar_t*
。
发布于 2013-05-31 17:17:18
MSVC项目有一个"Unicode“属性,您可以将其打开或关闭。当它被关闭时,所有的Win32函数都使用char
作为基本字符类型(因此,希望传递字符串的函数将需要一个` `const char*)。
启用时,使用的字符类型为wchar_t
。(所以函数使用const wchar_t*
作为字符串参数)。
该接口实际上定义了两个结构:WNDCLASSEXA
和WNDCLASSEXW
。前者使用char
,后者使用wchar_t
。
根据是否启用了Unicode (它定义了_UNICODE
预处理器宏),其中一个别名为WNDCLASSEX
。
因此,当启用Unicode时,WNDCLASSEX
实际上表示WNDCLASSEXW
。
API中处理字符数据的所有其他函数和类型也是如此。它们都有_A
和_W
变体
如果您不希望依赖于项目属性设置,则可以明确说明要使用的变量:
创建一个WNDCLASSEXW
(总是使用wchar_t
),而不是创建一个WNDCLASSEX
(这可以是两个不同的东西)。调用RegisterClassA
或RegisterClassW
,而不是调用RegisterClass
。
https://stackoverflow.com/questions/16862484
复制相似问题