有關Windows版本的宏

來源:互聯網
上載者:User

有關Windows版本的宏

在使用一些新版本的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, then C++, 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.