管理Windows XP和Vista / Server 2008之间的Windows API差异

时间:2010-02-12 15:18:35

标签: c++ c visual-studio-2008 winapi dll

我正在尝试创建一个简单的Win32应用程序的单个可执行文件,该应用程序必须能够在Windows XP和Windows Vista / 2008上运行。

由于Vista工作方式的一些变化,必须进行一些额外的Win32 API调用才能使程序正常运行,就像在XP上一样。

目前我检测应用程序是否在比XP更新的Windows版本上运行,并根据需要调用额外的win32函数。这在Vista和Server 2008上运行时工作正常,但在Windows XP上运行时失败。

在Windows XP程序启动时,我收到错误消息:程序入口点ShutdownBlockReasonCreate无法位于动态链接库USER32.DLL中。这在我的任何代码开始执行之前发生,并且在XP上运行时没有任何代码路径应该调用该函数。

我真的希望只有一个适用于XP和Vista的可执行文件。如果可能的话,我不想要有条件编译并且有两个可执行文件。

解决此问题的最佳方法是什么?

5 个答案:

答案 0 :(得分:6)

您必须使用LoadLibrary()和GetProcAddress()来获取此函数的入口点。在XP上,你将从GetProcAddress()获得一个NULL,足以简单地跳过这个调用。 SDK文档中有good example,唯一棘手的部分是声明函数指针:

  typedef BOOL (WINAPI *MYPROC)(HWND, LPCWSTR); 

答案 1 :(得分:4)

delay load does not work on function level开始,您必须通过从GetProcAddress返回的指针调用更新的函数,并检查Windows版本。

答案 2 :(得分:2)

  

在Windows XP程序启动时,我收到错误消息:无法在动态链接库USER32.DLL中找到程序入口点ShutdownBlockReasonCreate。

有关Xp和Vista Windows API的信息,请参阅此comparison table。根据{{​​3}},ShutdownBlockReasonCreate ( HWND hWnd, LPCWSTR pwszReason )符号已添加到Vista中(并且在XP中不存在)。我认为此表可以帮助您解决其他可移植性问题。

report for user32.dll

答案 3 :(得分:1)

Win32 SDK在multimon.h头文件中有一个很好的例子。 Windows 98/2000中添加了多个监视器支持,95或NT 4不支持。

#define COMPILE_MULTIMON_STUBS
#include "multimon.h"

当定义COMPILE_MULTIMON_STUBS时,将创建安全直通函数存根,在最低级别创建操作系统。这使得调用代码变得混乱GetVersionEx调用。

答案 4 :(得分:-1)

您还可以使用GetVersionEx功能确定您的程序运行的Windows版本。然后根据操作系统版本有条件地调用函数。 XP有dwMajorVersion = 5和dwMinorVersion = 1; Vista的dwMajorVersion = 6,dwMinorVersion = 0。