오류 처리 및 알림
프로그램이 지연 로드된 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
FARPROC
throw해야 함을 나타내기 위해 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됩니다. 이 예외는 모든 의도와 목적을 위해 치명적입니다.
자세한 내용은 구조 및 상수 정의를 참조 하세요.