INITCOMMONCONTROLSEX未在此范围内声明

时间:2018-04-11 22:44:22

标签: c windows winapi

编译时

#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的目的是什么?
  • 当MSDN没有写任何关于这样做的事情时,我真的需要对其值进行硬编码吗?

2 个答案:

答案 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标头之前包含的头文件来执行此操作。如果您使用预编译的标头,则可以在该文件的顶部执行此操作。