2010-02-12 185 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

相關問題