2014-10-10 127 views
1

我想問一下,在應用程序運行時,是否有某種方法可以檢測包含在我的應用程序中的DLL中的缺失函數。我知道使用HMODULE導入函數manualy的可能性,並在調用此函數時檢查它,但我不想以這種方式解決每個函數調用。想法是用一些try-catch塊或類似的東西來覆蓋函數調用,這不會導致應用程序崩潰。任何解決方案謝謝。缺少dll函數檢測

+0

這通常是非常容易診斷,你的程序不會啓動。所以沒有必要去測試*,而你正在運行,你*是*運行的事實足以證明你沒有問題:) – 2014-10-10 19:09:08

+0

我忘記寫我使用延遲加載只是由於非 - 開始,所以我的程序啓動一個if函數被調用,而不是崩潰。 – karfi 2014-10-10 19:13:51

+0

是否有任何不先測試你的程序沒有/延遲?如何捕獲運行時錯誤在MSDN中另有詳細記錄。 – 2014-10-10 19:15:36

回答

0

您可以嘗試調用該函數,如果函數不存在,該函數將生成EntryPointNotFoundException。例如(VB.NET):

Dim MissingFunction as Boolean = False 
Try 
    TheFunction() 
Catch ex As System.EntryPointNotFoundException 
    MissingFunction = True 
End Try 
0

根據MSDN(https://msdn.microsoft.com/en-us/library/1c9e046h.aspx),在C/C++與MSVC的編譯器,你可以做這樣的事情:

#include <windows.h> 
#define FACILITY_VISUALCPP ((LONG)0x6d) 
#define VcppException(sev,err) ((sev) | (FACILITY_VISUALCPP<<16) | err) 
const DWORD LIB_NOT_FOUND = VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND); 
const DWORD FUNC_NOT_FOUND = VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND); 

__try 
{ 
    MyDLLFunction(); 
} 
__except(GetExceptionCode() == LIB_NOT_FOUND || GetExceptionCode() == FUNC_NOT_FOUND 
     ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
{ 
    printf("library or function not found\n"); 
}