2013-10-15 38 views
1

我想在我的VC++應用程序中使用任務對話框。我能夠使用TaskDialog或TaskDialogIndirect成功創建任務對話框,並且在Vista中可以正常工作。但是,我希望我的應用程序能夠在Windows XP上工作,並且由於Windows XP不支持任務對話框,我創建了一個我自己想要使用的對話框,以便在操作系統是XP的情況下使用。VC++應用程序 - 在Windows XP中使用TaskDialog和fallback

所以我的代碼確實是這樣的:如果 操作系統是Vista或更高: 顯示TaskDialog其實 其他 顯示我自己的對話框

現在,應用程序仍然無法在Windows XP中工作。當我嘗試在XP上啓動應用程序時,出現錯誤「序號345無法位於動態鏈接庫comctl32.dll中」。 這可能是因爲在我的代碼中調用了TaskDialogIndirect,雖然調用在if塊中。在加載應用程序時,它會嘗試在comctl32.dll中找到該函數,並且它找不到它,因爲它是dll的XP版本。

所以我的問題是:

如何編寫我的應用程序,使其成功地運行在XP和Vista,以及XP的情況下,Vista的情況下表現出我自己的對話框,而和更高的顯示任務對話?

回答

1

問題是您的應用程序依賴於這些函數,這是OS加載程序在應用程序啓動時嘗試解析的依賴項。但是,當然,這些函數在XP中不存在,所以可執行文件無法加載。

有兩種解決方法。首先,請嘗試delay-loading comctl32.dll。這應該消除加載時間依賴性並延遲分辨率,直到實際調用該函數。那麼你只需要注意不要在不支持的地方調用它。

如果這不起作用,那麼您必須明確地綁定到TaskDialog,通過LoadLibraryGetProcAddress。這樣,你永遠不會以鏈接器知道的方式明確地提到函數,所以你不需要加載時間依賴它。儘管如此,還是有更多的工作,可以使用函數指針。

相關問題