프로그램이 지연 로드된 DLL을 사용하는 경우 프로그램이 실행되는 동안 발생하는 오류로 인해 처리되지 않은 예외가 발생하므로 오류를 강력하게 처리해야 합니다. 오류 처리는 후크를 통한 복구 및 예외를 통한 보고의 두 부분으로 구성됩니다.
DLL 지연 로드 오류 처리 및 알림에 대한 자세한 내용은 도우미 함수를 이해하세요.
후크 함수에 대한 자세한 내용은 구조 및 상수 정의를 참조 하세요.
후크를 통한 복구
코드는 실패 시 복구하거나 대체 라이브러리 또는 루틴을 제공해야 할 수 있습니다. 대체 코드를 제공하거나 상황을 해결할 수 있는 도우미 함수에 후크를 제공할 수 있습니다. 후크 루틴은 처리가 계속( HINSTANCE 또는 FARPROC)될 수 있도록 적절한 값을 반환해야 합니다. 또는 0을 반환하여 예외를 throw해야 함을 나타낼 수 있습니다. 또한 자체 예외를 throw하거나 longjmp 후크에서 벗어날 수 있습니다. 알림 후크 및 실패 후크가 있습니다. 동일한 루틴을 둘 다에 사용할 수 있습니다.
알림 후크
지연 로드 알림 후크는 도우미 루틴에서 다음 작업을 수행하기 직전에 호출됩니다.
라이브러리에 저장된 핸들이 이미 로드되었는지 확인합니다.
LoadLibrary는 DLL의 로드를 시도하기 위해 호출됩니다.GetProcAddress는 프로시저의 주소를 가져오기 위해 호출됩니다.지연 가져오기 로드 펑크로 돌아갑니다.
알림 후크가 사용하도록 설정됩니다.
알림을 받는 사용자 고유의 함수를 가리키도록 초기화된 포인터
__pfnDliNotifyHook2의 새 정의를 제공합니다.또는
프로그램이 로드를 지연하는 DLL을 호출하기 전에 후크 함수에 대한 포인터
__pfnDliNotifyHook2를 설정합니다.
알림이 dliStartProcessing있는 경우 후크 함수는 다음을 반환할 수 있습니다.
NULL기본 도우미는 DLL의 로드를 처리합니다. 정보 제공 목적으로만 호출하는 것이 유용합니다.
함수 포인터
기본 지연 로드 처리를 무시합니다. 사용자 고유의 부하 처리기를 제공할 수 있습니다.
알림이 dliNotePreLoadLibrary있는 경우 후크 함수는 다음을 반환할 수 있습니다.
정보 알림만 원하는 경우 0입니다.
HMODULE로드된 DLL의 경우 DLL 자체를 로드한 경우입니다.
알림이 dliNotePreGetProcAddress있는 경우 후크 함수는 다음을 반환할 수 있습니다.
정보 알림만 원하는 경우 0입니다.
후크 함수가 주소 자체를 가져오는 경우 가져온 함수의 주소입니다.
알림이 있으면 dliNoteEndProcessing후크 함수의 반환 값이 무시됩니다.
이 포인터가 초기화되면(0이 아닌) 지연 로드 도우미는 실행 내내 특정 알림 지점에서 함수를 호출합니다. 함수 포인터에는 다음 정의가 있습니다.
// The "notify hook" gets called for every call to the
// delay load helper. This allows a user to hook every call and
// skip the delay load helper entirely.
//
// dliNotify == {
// dliStartProcessing |
// dliNotePreLoadLibrary |
// dliNotePreGetProc |
// dliNoteEndProcessing}
// on this call.
//
ExternC
PfnDliHook __pfnDliNotifyHook2;
// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
PfnDliHook __pfnDliFailureHook2;
알림은 알림 값과 함께 후크 함수에 구조를 전달 DelayLoadInfo 합니다. 이 데이터는 지연 로드 도우미 루틴에서 사용하는 데이터와 동일합니다. 알림 값은 구조 및 상수 정의에 정의된 값 중 하나가 됩니다.
오류 후크
오류 후크는 알림 후크와 동일한 방식으로 사용하도록 설정됩니다. 후크 루틴은 처리를 계속할 수 있도록 적절한 값을 반환하거나 예외를 HINSTANCE FARPROCthrow해야 함을 나타내기 위해 0을 반환해야 합니다.
사용자 정의 함수를 참조하는 포인터 변수는 다음과 같습니다.
// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
PfnDliHook __pfnDliFailureHook2;
구조체에는 DelayLoadInfo 오류를 자세히 보고하는 데 필요한 모든 관련 데이터가 포함됩니다(값 포함) GetLastError.
알림이 dliFailLoadLib있는 경우 후크 함수는 다음을 반환할 수 있습니다.
실패를 처리할 수 없는 경우 0입니다.
오류
HMODULE후크가 문제를 해결하고 라이브러리 자체를 로드한 경우
알림이 dliFailGetProc있는 경우 후크 함수는 다음을 반환할 수 있습니다.
실패를 처리할 수 없는 경우 0입니다.
오류 후크가 주소 자체를 가져오는 데 성공한 경우 유효한 절차 주소(가져오기 함수 주소)입니다.
예외를 사용하여 보고
오류를 처리하는 데 필요한 모든 것이 프로시저를 중단하는 것이라면 사용자 코드가 예외를 처리할 수 있는 한 후크가 필요하지 않습니다.
로드 예외 코드 지연
지연된 로드 중에 오류가 발생할 때 구조적 예외 코드가 발생할 수 있습니다. 예외 값은 매크로를 사용하여 지정됩니다.VcppException
//
// Exception information
//
#define FACILITY_VISUALCPP ((LONG)0x6d)
#define VcppException(sev,err) ((sev) | (FACILITY_VISUALCPP<<16) | err)
실패의 LoadLibrary 경우 표준 VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND) 이 throw됩니다. 오류의 GetProcAddress 경우 throw된 오류는 .입니다 VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND). 예외는 구조체에 대한 포인터를 DelayLoadInfo 전달합니다. 이 값은 LPDWORD 구조체에서 검색된 GetExceptionInformation EXCEPTION_RECORD 필드의 값에 있습니다 ExceptionInformation[0] .
필드에 잘못된 비트가 설정 grAttrs 되면 예외 ERROR_INVALID_PARAMETER 가 throw됩니다. 이 예외는 모든 의도와 목적을 위해 치명적입니다.
자세한 내용은 구조 및 상수 정의를 참조 하세요.