문제

별도의 DLL을 동적으로 여러 번 호출 해야하는 DLL을 작성하고 있습니다. Callee를로드 한 다음 DLL을 내릴 때 하역하고 싶습니다. 그러나 Microsoft에 따르면, 그것은 a입니다 나쁜 생각.

진입 점 함수는 간단한 초기화 작업 만 수행해야하며 다른 DLL로드 또는 종료 기능을 호출해서는 안됩니다. 예를 들어, 진입 점 함수에서 LoadLibrary 함수 또는 LoadLibraryEx 기능을 직접 또는 간접적으로 호출해서는 안됩니다. 또한 프로세스가 종료 될 때 프리 브리 브리 기능을 호출해서는 안됩니다.

다음은 불쾌한 코드입니다. 누군가 내 DLL의 진입 점에서로드 리브러리와 프리 브리 브리를 호출해서는 안되는 이유를 설명 할 수 있습니까?

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
switch (ul_reason_for_call) {
    case DLL_PROCESS_DETACH :
            if (hLogLib != NULL) FreeLibrary(hLogLib);
            break;
    }
    return TRUE;
}
도움이 되었습니까?

해결책

내가 찾은 것 같아요 대답.

항목 기능은 간단한 초기화 또는 종료 작업 만 수행해야합니다. dll로드 순서에서 종속성 루프를 생성 할 수 있기 때문에 loadlibrary 또는 loadlibraryex 함수 (또는 이러한 함수를 호출하는 함수)를 호출해서는 안됩니다. 이로 인해 시스템이 초기화 코드를 실행하기 전에 DLL이 사용될 수 있습니다. 마찬가지로, 진입 점 함수는 프로세스 종료 중에 프리 브리 브리 함수 (또는 프리 브리 브리라고 부르는 함수)를 호출해서는 안됩니다. 시스템이 종결 코드를 실행 한 후 DLL을 사용할 수 있기 때문입니다.

다른 팁

DLLMAIN 함수가 OS 로더 잠금 장치 내부에서 실행되며 로더 잠금 (예 : loadLibrary를 호출하여)을 재확인하려는 시도로 인해 입구에서 LoadLibrary를 호출 할 수 없습니다.

하지 마십시오 결과의 모든 것 dllmain 내부. 진지하게. 프리라이브러리를 부르는 것은 단지 더 나쁩니다 때때로 교착 상태, 무료로 발생하면 Refcount가 0으로 감소하고 라이브러리가 실제로 해제됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top