我现在要写一个程序,要能在Win2K和Win98下都能使用,现在的问题是我的程序用到了一些NTDDK的东东,而用到NTDDK的那部分代码是不需要在Win98下执行的,
现在的问题是我想同一个软件能不能在Win2K下和Win98下执行不同的东西(因为Win98不支持那些NTDDK的函数,运行的时候会报错,而Win2K下又必须使用)。
注意:不能说什么在Win98下运行的程序和Win2K运行的分开编译(因为我要用同一个EXE分别在两个操作系统上运行!)

解决方案 »

  1.   

    ……运行不同的程序不就是分开编译么?你可以判断操作系统版本啊,判断完了执行不同的代码
    BOOL IsWin2000 () 
    {
       OSVERSIONINFOEX osvi;
       BOOL bOsVersionInfoEx;   // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
       // which is supported on Windows 2000.
       //
       // If that fails, try using the OSVERSIONINFO structure.   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
       {
          // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
          if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
             return FALSE;
       }   switch (osvi.dwPlatformId)
       {
          case VER_PLATFORM_WIN32_NT:         if ( osvi.dwMajorVersion >= 5 )
                return TRUE;         break;
       }
       return FALSE; 
    }
      

  2.   

    一般来说,在不同操作系统下执行不同的操作是可以通过GetVersionEx()函数来进行分判的。这一点上 jiangsheng(蒋晟.Net) 提供了很好的例子。至于你说的条件编译,可以用宏来控制,以达到增减功能的目的
      

  3.   

    如果那些函数是动态库中的,使用LoadLibrary和GetProcAddress显式调用库函数,不要使用加头文件和连接.lib的方式使用动态库函数,这会导致在Win98下找不到目标函数地址失败。具体区分Win2000和Win98的方式,一楼已经说了。
      

  4.   

    还有一种方法是使用延时加载DLL,这个特性使得程序在你的代码试图引用DLL中包含的一个符号时才进行加载。这刚好符合你的情况。延时加载DLL的具体操作请参看Windows核心编程第20章。不过如果你使用的NTDDK中的函数不是很多,建议使用我上面提到的方法就可以了。
    if(IsWinNT()){
      LoadLibrary();
      pfn = GetProcAddress();
      pfn();
      FreeLibrary();
    }
    else{
      //do nothing;
    }
      

  5.   

    延时加载DLL:
    在你的文件头加上下面几句
    #pragma comment(lib,"Delayimp.lib")
    #pragma comment(linker,"/DelayLoad:\"mydll.dll\"")//使用NTDDK中的dll替换mydll.dll
    #pragma comment(linker,"/Delay:unload")
    #pragma comment(linker,"/Delay:nobind")这样将确保只有在你调用NTDDK中的函数时才会加载NTDDK的动态库,而不是进程启动时加载动态库。