2014-10-10 3 views
1

Я хочу спросить, есть ли способ обнаружить недостающую функцию в DLL, включенную в мое приложение, в то время как приложение запущено. Я знаю о возможности импортировать функцию manualy с помощью HMODULE и проверять ее при вызове этой функции, но я не хочу так решать каждый вызов функции. Идея состоит в том, чтобы покрыть вызов функции с помощью блока try-catch или что-то подобное, что не приводит к сбою приложения. Любые решения? Благодарю.Отсутствует обнаружение функции dll

+0

Это обычно очень легко диагностировать, ваша программа не запустится. Поэтому нет смысла тестировать * пока * вы работаете, тот факт, что вы * работаете *, является достаточным доказательством того, что у вас нет проблемы :) –

+0

Я забыл написать, что я использую задержку загрузки только из-за причины отсутствия -starting, поэтому моя программа запускает функцию if, а не сбой. – karfi

+0

Есть ли какая-нибудь точка, чтобы не тестировать вашу программу вначале без/delayload ??? Как улавливать ошибки во время выполнения, в других случаях хорошо документировано в MSDN. –

ответ

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"); 
}