在驱动程序的例子中到处都见到“#if WINVER == 0x0???”这样的语句。但没找到对应的#define WINVER语句。按我的理解,没有对应的#define WINVER语句,编译时就应该把“#if WINVER”和对应的“#endif”之间的语句全部跳过去了。但程序看上去不可能是这么处理的。不知道为什么?特此请教。谢谢!

解决方案 »

  1.   

    这个宏是系统定义的宏。
    Minimum System Required Macros to Define 
    Windows 95 and Windows NT 4.0 WINVER=0x0400  
    Windows 98 and Windows NT 4.0 _WIN32_WINDOWS=0x0410 and WINVER=0x0400 
    Windows NT 4.0 _WIN32_WINNT=0x0400 and WINVER=0x0400 
    Windows 98 and Windows 2000 WINVER=0x0500 
    Windows 2000 _WIN32_WINNT=0x0500 and WINVER=0x0500 
    Internet Explorer 3.0 _WIN32_IE=0x0300 
    Internet Explorer 4.0 _WIN32_IE=0x0400 
    Internet Explorer 5.0 _WIN32_IE=0x0500 
    具体定义在window.h文件中
      

  2.   

    WINVER的定义可以找得到的,仔细找一下
    vc6在winver.h
    vc7在windows.h
      

  3.   

    可以在stdafx.h中#include <afx.h>(或是#include <windows.h>)之前定义,这些值的含义如happyarrot所说,XP,2003是0x0510
      

  4.   

    谢谢happyparrot(快乐鹦鹉)。问题是这个宏是在编译的时候解释还是运行的时候解释的?如果是编译的时候解释的,那就与本机的操作系统版本是一致的。但生成的驱动程序是要放到其他计算机上运行的。而其他计算机上的操作系统版本可能与本机并不一致呀。还请继续赐教。谢谢!
      

  5.   

    谢谢DentistryDoctor(My heart will fly,in the sky.)。您的意思是自己定义?我想也应该是这样。但驱动程序例子中没提供一个缺省值,以便学习者知道如何修改。这种做法有点儿不可思议。
      

  6.   

    还有,在Ifs DDK提供的驱动程序例子中,并没有上述这些头文件。
      

  7.   

    我编译IfsDDK自带的sfilter例子时,如果不在sfilter.c的第一行增加#define WINVER 0x0501,编译能通过,但不知道生成的驱动程序用于哪种操作系统。如果在sfilter.c的第一行增加#define WINVER 0x0501,编译时总是报如下错误:WINVER这个宏重复定义。我的这个问题还没得到解决。还请各位高人继续赐教。谢谢!
      

  8.   

    没有对应的#define WINVER语句,编译时就应该把“#if WINVER”和对应的“#endif”之间的语句全部跳过去了
    ---------------
    系统定义的,当然有的
      

  9.   

    这应当和c/c++中的宏定义差不多如:#ifdef __cpluspuls之类相似吧,系统定义的在底层有定义的只是看不到罢了。
      

  10.   

    C++宏是在编译的时候解释的。如果你想在运行时判断操作系统的版本,那么你需要参考操作系统的API,对于Windows 2000以上版本的Windows,你可以用GetVersionInfo。
    定义一个符号之前应该用#ifdef或者#ifndef判断是否有重定义符号的现象。
      

  11.   

    宏编译时解释,系统自己定义了
    可以通过#ifdef等宏来防止头文件重复包含
      

  12.   

    我自己把问题的原因查出来了。不仅需要在每个出现#if WINVER的C程序中增加#define WINVER 0x0501,有时还需要在一些DDK和SDK的头文件中增加#define WINVER 0x0501(否则,编译都通不过)。很多年前使用VC5.0时曾因为VC5.0的错误而不得不改动VC5.0的源码。这次在这么多文件中增加#define WINVER 0x0501,也真想不到。谢谢各位的热情指导!