2011-07-08 31 views
2

我打電話給SetErrorMode無效?

"SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);" 

加載DLL之前。儘管如此,一個Windows消息彈出

「此應用程序未能啓動 因爲blabla.dll沒有找到...」。

爲什麼會發生這種情況?我認爲這是SetErrorMode應該防止的? 謝謝!

回答

3

SetErrorMode的調用可能永遠不會執行 - 如果靜態鏈接到DLL,它將隨可執行文件一起加載。您看到的消息由操作系統彈出,而不是由您的代碼彈出。如果你想控制DLL的負載,你應該使用LoadLibrary加載它 - 但是然後使用導出的函數有點困難。

您可以創建自己的加載程序(一個不同的可執行文件),它將確保所有的DLL都可用,然後運行主要的可執行文件。但這可能是一個矯枉過正的問題......

+0

恩,我想這裏有一點誤解。對不起,沒有更清楚。實際上,DLL通過LoadLibrary加載。 SetErrorMode在100%確定之前執行。但是當時加載另一個DLL(由我加載的DLL使用)失敗... – Boris

+0

以前執行的代碼會以某種方式禁止設置錯誤模式嗎?例如。錯誤模式已由應用程序的另一部分設置,現在我無法將其設置爲不同的東西? – Boris

+0

@Hans,這可能是發生了什麼事情。通常,SetErrorMode成功禁止LoadLibrary錯誤通知。嘗試在失敗後立即調用'GetErrorMode',看看它的當前值是什麼。如果它改變了,那就是你的問題。學習開發DLL的一個教訓 - 總是考慮某人之前調用SetErrorMode的可能性,並根據需要考慮屏蔽現有值......如果是這種情況,則可能需要手動檢查是否存在所需的LoadLibrary之前的DLL。 – eran