在使用一些新版本的API,或者控件的新特性(比如新版的ComCtl32.dll)的时候,你可能会得到“error C2065: undeclared identifier.“这个错误。原因是这些功能是依赖于你的操作系统的版本的。而你的头文件中的定义并不是最新的。(对于MFC,就是stdafx.h)下面这篇MSDN文章介绍了如何解决这个问题,并详细列举了每个Windows版本对应的
NTDDI_VERSION,
_WIN32_WINNT,
WINVER,
_WIN32_IE这些宏。
原文:
http://msdn2.microsoft.com/en-us/library/aa383745.aspx
标题:Using the Windows Headers
The header files for the Windows API enable you to create 32- and 64-bit applications. They include declarations for both Unicode and ANSI versions of the API. For more information, see
Unicode in the Windows API. They use data types that allow you to build both 32- and 64-bit versions of your application from a single source code base. For more information, see
Getting Ready for 64-bit Windows. Additional features include
Header Annotations and
STRICT Type Checking.
Microsoft Visual C++ includes copies of the Windows header files that were current at the time Visual C++ was released. Therefore, if you install updated header files from an SDK, you may end up with multiple versions of the Windows header files on your computer. If you do not ensure that you are using the latest version of the SDK header files, you will receive the following error code when compiling code that uses features that were introduced after Visual C++ was released: error C2065: undeclared identifier. Conditional Declarations Certain functions that depend on a particular version of Windows are declared using conditional code. This enables you to use the compiler to detect whether your application uses functions that are not supported on its target version(s) of Windows. To compile an application that uses these functions, you must define the appropriate macros. Otherwise, you will receive the C2065 error message. The Windows header files use macros to indicate which versions of Windows support many programming elements. Therefore, you must define these macros to use new functionality introduced in each major operating system release. (Individual header files may use different macros; therefore, if compilation problems occur, check the header file that contains the definition for conditional definitions.) For more information, see Sdkddkver.h. The following table describes the preferred macros in use by the Windows header files.
Minimum system required | Macros to define |
---|
Windows Vista | NTDDI_VERSION >=NTDDI_LONGHORN | Windows Server 2003 SP1 | NTDDI_VERSION >=NTDDI_WS03SP1 | Windows Server 2003 | NTDDI_VERSION >=NTDDI_WS03 | Windows XP SP2 | NTDDI_VERSION >=NTDDI_WINXPSP2 | Windows XP SP1 | NTDDI_VERSION >=NTDDI_WINXPSP1 | Windows XP | NTDDI_VERSION >=NTDDI_WINXP | Windows 2000 SP4 | NTDDI_VERSION >=NTDDI_WIN2KSP4 | Windows 2000 SP3 | NTDDI_VERSION >=NTDDI_WIN2KSP3 | Windows 2000 SP2 | NTDDI_VERSION >=NTDDI_WIN2KSP2 | Windows 2000 SP1 | NTDDI_VERSION >=NTDDI_WIN2KSP1 | Windows 2000 | NTDDI_VERSION >=NTDDI_WIN2K |
The following table describes the legacy macros in use by the Windows header files.
Minimum system required | Macros to define |
---|
Windows Vista | _WIN32_WINNT>=0x0600 WINVER>=0x0600 | Windows Server 2003 | _WIN32_WINNT>=0x0502 WINVER>=0x0502 | Windows XP | _WIN32_WINNT>=0x0501 WINVER>=0x0501 | Windows 2000 | _WIN32_WINNT>=0x0500 WINVER>=0x0500 | Windows NT 4.0 | _WIN32_WINNT>=0x0400 WINVER>=0x0400 | Windows Me | _WIN32_WINDOWS=0x0500 WINVER>=0x0500 | Windows 98 | _WIN32_WINDOWS>=0x0410 WINVER>=0x0410 | Windows 95 | _WIN32_WINDOWS>=0x0400 WINVER>=0x0400 | Internet Explorer 7.0 | _WIN32_IE>=0x0700 | Internet Explorer 6.0 SP2 | _WIN32_IE>=0x0603 | Internet Explorer 6.0 SP1 | _WIN32_IE>=0x0601 | Internet Explorer 6.0 | _WIN32_IE>=0x0600 | Internet Explorer 5.5 | _WIN32_IE>=0x0550 | Internet Explorer 5.01 | _WIN32_IE>=0x0501 | Internet Explorer 5.0, 5.0a, 5.0b | _WIN32_IE>=0x0500 | Internet Explorer 4.01 | _WIN32_IE>=0x0401 | Internet Explorer 4.0 | _WIN32_IE>=0x0400 | Internet Explorer 3.0, 3.01, 3.02 | _WIN32_IE>=0x0300 |
Note that some features introduced in the latest version of Windows may be added to a service pack for a previous version of Windows. Therefore, to target a service pack, you may need to define _WIN32_WINNT with the value for the next major operating system release. For example, the GetDllDirectory function was introduced in Windows Server 2003 and is conditionally defined if _WIN32_WINNT is 0x0502 or greater. This function was also added to Windows XP SP1. Therefore, if you were to define _WIN32_WINNT 0x0501 to target Windows XP, you would miss features that are defined in Windows XP SP1. You can define these symbols by using the #define statement in each source file, or by specifying the /D compiler option supported by Visual C++. To specify compiler options, go to the Projects menu and click Properties. Go to Configuration Properties, thenC++, then Command Line. Enter the option under Additional Options. Faster Builds with Smaller Header Files You can reduce the size of the Windows header files by excluding some of the less common API declarations as follows:
- Define WIN32_LEAN_AND_MEAN to exclude APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets.
- Define one or more of the NOapi symbols to exclude the API. For example, NOCOMM excludes the serial communication API. For a list of support NOapi symbols, see Windows.h
例:
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 项目特定的包含文件
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN// 从 Windows 标头中排除不常使用的资料
#endif
// 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。
// 有关不同平台的相应值的最新信息,请参考 MSDN。
#ifndef WINVER// 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500//为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINNT// 允许使用 Windows NT 4 或更高版本的特定功能。
#define _WIN32_WINNT 0x0500//为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINDOWS// 允许使用 Windows 98 或更高版本的特定功能。
#define _WIN32_WINDOWS 0x0410 //为 Windows Me 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_IE// 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0400//为 IE 5.0 及更新版本改变为适当的值。
#endif
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS// 某些 CString 构造函数将是显式的
// 关闭 MFC 对某些常见但经常被安全忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 核心和标准组件
#include <afxext.h> // MFC 扩展
#include <afxdisp.h> // MFC 自动化类
#include <afxdtctl.h>// Internet Explorer 4 公共控件的 MFC 支持
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>// Windows 公共控件的 MFC 支持
#endif // _AFX_NO_AFXCMN_SUPPORT
|