다음을 통해 공유


오류 처리 및 알림

프로그램이 지연 로드된 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됩니다. 이 예외는 모든 의도와 목적을 위해 치명적입니다.

자세한 내용은 구조 및 상수 정의를 참조 하세요.

참고 항목

지연 로드된 DLL에 대한 링커 지원