The Win32 SDK does not come in different versions for different platforms. For example, if you choose to develop for Windows 98, you should work with the same SDK as you would when developing for Windows XP. The solution Microsoft offers to enforce a minimum system requirement for a particular application works through a set of preprocessor macros used widely in the Windows header files. These macros are WINVER, _WIN32_WINDOWS, _WIN32_WINNT, and _WIN32_IE. You should define these macros to a hexadecimal number that varies for each platform. Here's a table that indicates which macros need to be defined for developing for a particular platform, and what number should they be defined to.
System Requirement
WINVER
_WIN32_WINDOWS
_WIN32_WINNT
_WIN32_IE
Windows 95 and NT 4.0
0x0400
n/a
n/a
n/a
Windows 98 and NT 4.0
0x0400
0x0410
n/a
n/a
Windows NT 4.0
0x0400
n/a
0x0400
n/a
Windows 98
n/a
0x0410
n/a
n/a
Windows Me
n/a
0x0490
n/a
n/a
Windows 2000
0x0500
n/a
0x0500
n/a
Windows XP and Windows .NET Server
0x0501
n/a
0x0501
n/a
Internet Explorer 3.0, 3.01, 3.02
n/a
n/a
n/a
0x0300
Internet Explorer 4.0
n/a
n/a
n/a
0x0400
Internet Explorer 4.01
n/a
n/a
n/a
0x0401
Internet Explorer 5.0, 5.0a, 5.0b
n/a
n/a
n/a
0x0500
Internet Explorer 5.01, 5.5
n/a
n/a
n/a
0x0501
Internet Explorer 6.0
n/a
n/a
n/a
0x0560
or
0x0600
In order to use the above macros, you should define them before including any other header files. For example, if you want to develop an application targeting Windows 98, Me, NT 4.0, 2000, XP, with a minimum of Internet Explorer 5.0 installed, you should include Windows headers like this:
#define WINVER 0x0400
#define _WIN32_WINDOWS 0x0410
#define _WIN32_IE 0x0500
#include <windows.h>
// include other necessary headers as well...
You should find the minimum system requirement, and define the macros dependently. In the above example, the minimum system requirement is Windows 98 and NT 4.0 with Internet Explorer 5.0 installed. In other words, any application developed with regard to those requirements is compatible with higher system versions.
Note that this is only a compile-time check. You should perform run-time checks as well. By being strict in defining the above macros as necessary, you ensure that you won't use any features that are not present in the target platform.
This article originally appeared on BeginThread.com. It's been republished here, and may contain modifications from the original article.