2015-02-24 47 views
0

更新如何正確使用IsWindowsXPOrGreater函數?

我已經重寫了原來的問題如前文不是描述我的真正的問題更多的是一個故事:

我們有一組應用程序面向Windows XP達到Windows 8.1和Windows Server 2008 2012(也支持32位/ 64位版本)。以前,我們在代碼中沒有做任何事情來確保您在這些平臺上運行。

在創建我們的Windows API包裝類集時,我們對使用IsWindowsXPOrGreater函數調用進行了更改。如果這個調用返回false,我們會拋出一個異常,這個異常將被捕獲並導致顯示錯誤消息。

但是,該錯誤消息是通過跳過一組Windows API調用創建的。根據MSDN的大部分調用需要Windows 2000或更高版本,但少數是Windows XP或更高版本。

在實現單元測試和mod之後,我開始懷疑如果我們在Windows XP之前的任何軟件上運行該軟件,代碼將實際運行 - 因爲IsWindowsXPOrGreater函數需要Windows 2000或更高版本,否則錯誤消息模塊將失敗在他們對Windows API的調用中。

我已經向我的同事們展示過,如果我強制IsWindowsXPOrGreater給出錯誤返回,會引發異常,但最終會導致無限循環,因爲我們的錯誤消息模塊會引發異常的另一個實例,我們再次選取嘗試使用Windows API等。

問題

如果IsWindowsXPOrGreater返回false的Windows API調用是安全的任何32位安裝Windows操作系統的使用?

對於大多數Windows API函數,MSDN似乎顯示了Windows 2000或Windows XP的最低限度。是否有早期版本的User32.dll,Kernel32.dll等文件?

我目前的解決方法

我們從此改變了我們的代碼搭上新LowerThanWindowsXPException - 將使用一種變型包裝器MessageBox終止應用程序之前顯示一個簡單的信息。這個變體不檢查windows版本,並且基於我們已經存在的一些遺留的Visual Basic代碼。這在Windows 95上工作,雖然我們現在沒有辦法檢查。

未來我們將使用IsWindows7OrGreater進行其他Windows API調用,在這些情況下,我們將引發一個LowerThanWindows7Exception - 我們可以採用不同的方式進行處理(例如,使用我們的Windows XP API調用來顯示錯誤消息或下降回到一些替代功能)。

+2

這是太多的文字,但如果任何人使用早於Windows XP的東西,並且您不知道它,那麼您可能不應該在乎它們。 – 2015-02-24 07:43:19

+0

我已經閱讀了兩次,但仍然無法解決你所問的問題。 – 2015-02-24 08:56:57

+0

如果在XP系統之前沒有使用過,那麼你爲什麼要檢查它? – 2015-02-24 09:35:16

回答

3

當您鏈接時,您可以使用/DELAYLOAD,以便您的應用程序只會在您從該DLL調用函數時嘗試加載DLL。

從那裏,如果新版本的Windows不可用,則可以使用舊功能打印出錯誤消息。只是一個明顯的例子,自從16位Windows日子以來,已經有了MessageBox。使用它,任何32位Windows系統回到Windows 95和/或Windows NT 3。1將打印出你的錯誤信息沒有問題。 LoadString是另一種從早期開始就已經存在的功能,因此使用它也不會導致舊版Windows的問題。

基本上,它不工作的唯一方法是如果他們在沒有安裝Win32的純16位Windows系統(Windows 3.1或更早版本)上運行它,在這種情況下,他們只會收到一條消息,說Windows可以不加載可執行文件。如果有人還在運行16位Windows,他們可能已經習慣於現在看到這種情況。

+0

如果任何* 32.dlls加載失敗,我們沒有任何問題。你對MessageBox的建議很有幫助,我們可以在VB中挖掘一些遺留代碼,看看它是如何在Windows 95機器上使用的。 – camelCase 2015-02-24 19:38:08