2010-02-12 123 views
4

我想创建一个简单的Win32应用程序的单个可执行文件,该应用程序必须能够在Windows XP和Windows Vista/2008上运行。管理Windows XP和Vista/Server 2008之间的Windows API差异

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

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

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

我真的很想只有一个在XP和Vista上都可用的可执行文件。如果可能的话,我不想有条件编译,并有两个可执行文件。

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

回答

6

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

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

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

1

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

#define COMPILE_MULTIMON_STUBS 
#include "multimon.h" 

当COMPILE_MULTIMON_STUBS定义安全直通功能存根将interogate在最低水平的操作系统创建的。这使GetVersionEx调用代码变得混乱。

2

在Windows XP中的程序开始我得到的错误消息时:程序入口点ShutdownBlockReasonCreate不能设在他们的动态链接库USER32.DLL。

对于Xp和Vista Windows API,请参阅此comparison table。根据report for user32.dllShutdownBlockReasonCreate (HWND hWnd, LPCWSTR pwszReason)符号已添加到Vista中(并且在XP中不存在)。我认为这张表可能会帮助您解决其他可移植性问题。

enter image description here

相关问题