我正在尝试创建一个简单的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的可执行文件。如果可能的话,我不想要有条件编译并且有两个可执行文件。
解决此问题的最佳方法是什么?
答案 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中不存在)。我认为此表可以帮助您解决其他可移植性问题。
答案 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。