编译时
#include<windows.h>
#include <commctrl.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX ex;
return 0;
}
带
g++ 1.cpp -w -g -lgdi32 -lcomctl32 -o 1.exe
我收到错误
1.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
1.cpp:8:2: error: 'INITCOMMONCONTROLSEX' was not declared in this scope
INITCOMMONCONTROLSEX ex;
^.
我怀疑我收到此错误,因为在commctrl.h中,#if
条件不正确。
#if (_WIN32_IE >= 0x0300)
typedef struct tagINITCOMMONCONTROLSEX {
DWORD dwSize;
DWORD dwICC;
} INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX;
#endif
我尝试编译
#define _WIN32_IE 0x0300
#include<windows.h>
#include <commctrl.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX ex;
return 0;
}
这很好,我没有任何错误。我查了MSDN,但没有写关于在那里添加#define _WIN32_IE 0x0300
的文章。
问题:
_WIN32_IE
的目的是什么? 答案 0 :(得分:3)
Windows 95 / Windows NT附带的初始版本的comctl32。从那时起,每个版本到Windows 7都有一个新的更新版本,但这些新版本首次作为Internet Explorer的一部分发布。 Internet Explorer 3,4,5,6和7通常包含新版本的comctl32,shlwapi和shell32。
现在这主要是古代历史,但您仍然需要声明要定位的Windows和IE版本以解锁某些功能。
将#define _WIN32_IE 0x0300
添加到您的代码中可以解锁IE 3.0中引入的功能,并且您的程序只能在Windows 95 ORS 2或更高版本上运行,Windows 95 RTM将需要安装IE3或4。
您不关心Windows 95(希望如此),但同样类型的#if
检查也适用于许多其他较新的功能,并且并非所有功能都在MSDN上正确记录,因为它们可能假设您是使用不到20年的Visual Studio项目。
不幸的是,MSDN上列出的最低操作系统版本是错误的,无法信任。微软已经在2000年之前删除了99%的有关版本的信息,他们似乎在2003 / Vista之前忽略了任何东西。
答案 1 :(得分:1)
_WIN32_IE的目的是什么?
Internet Explorer附带的扩展通用控件库,在它成为Windows的标准部分之前。如果您set the macros to tell the SDK which version of Windows you're targeting,那么SDK可能会为您设置IE版本。
您必须为此功能执行此操作,这表明您使用的是旧版本的Visual Studio和/或SDK。您可能需要考虑更新。
请注意,对于这些常用控件,您可能还需要确保启用Windows Visual Styles。
当MSDN没有写任何关于这样做的事情时,我真的需要对其值进行硬编码吗?
您应根据MSDN指南设置WINVER
和_WIN32_WINNT
。根据您拥有的Visual Studio版本,您可以使用项目属性进行设置。您也可以使用编译器命令行上的/D
选项或任何Windows标头之前包含的头文件来执行此操作。如果您使用预编译的标头,则可以在该文件的顶部执行此操作。