2012-08-06 2 views
1

이것은 프로덕션 코드가 아니며 단위 테스트 용입니다.암시 적으로 링크 된 DLL을 명시 적으로 연결 해제 할 수있는 방법이 있습니까?

DLL_PROCESS_DETACH 이벤트에서 리소스를 해제하는 레거시 DLL이 있습니다. 정적 변수의 소멸자가 DLL에 매핑되지 않은 리소스 (매달린 참조)에 액세스하려고했기 때문에 실행 가능 파일의 정적 파괴 단계에서 충돌 시나리오가 발생했습니다.

단위 테스트에서이 충돌 시나리오를 재현하여 수정했음을 증명할 수 있습니다.

답변

2

모듈에 대한 핸들을 GetModuleHandle(LPCTSTR lpModuleName)으로 가져 와서 FreeLibrary()으로 전달할 수 있습니다.

문서 GetModuleHandle()에 대한 상태 :

GetModuleHandle 기능은 참조 카운트를 증가하지 않고 매핑 모듈에 대한 핸들을 반환합니다. 그러나이 핸들을 FreeLibrary 함수에 전달하면 매핑 된 모듈의 참조 횟수가 감소합니다. 따라서 GetModuleHandle에 의해 반환 된 핸들을 FreeLibrary 함수에 전달하지 마십시오. 그렇게하면 DLL 모듈이 너무 일찍 매핑 해제 될 수 있습니다. 그렇게 할 수있는 경고 하지에도 불구하고

는, 그게 당신이 찾고 정확히처럼 들린다. 이 시나리오는 시나리오에서 테스트하기가 쉽고 원하는대로 작동하는지 확인해야합니다.

+1

나는 당신이 대답 한 것과 정확히 일치하는 내 자신의 질문에 답변하려고했으나, 먼저 그것을 테스트하고 싶었습니다. GetModuleHandle() 및 FreeLibrary() 함께 내 DLL을 찾을 수있게 된 것처럼 보입니다. TRUE를 반환합니다 ... 이제 DLL이 실제로 언로드되었는지 확인하려고합니다. – paxos1977

+0

@ceretullis Excellent :-) 그것이 실제로 작동하는지 알려주세요! –

+0

@ceretullis 나는 그것을 받아 들일 수없는 unaccept에서 가져가? –

관련 문제