2010-08-16 5 views
19

내가 모든 올바른 서로 다른 주소를 가지고 있어야 각 도서관에 3 개 별개의 핸들과 기능을 반환해야 행에서 같은 DLL 3 회를로드 할 수 을 LoadLibrary는 Win32 API를 사용하는 경우? (아니면 "스마트"뭔가를하고 DLL이 이미 프로세스에로드 된 단지 동일한 모듈을 가리 경우 감지합니까?)LoadLibrary가 고유 한 인스턴스를 생성합니까?

답변

21

그것은 재치있게 일을 수행합니다. Windows는 LoadLibrary를 통해로드 된 각 DLL에 대한 참조 수를 유지합니다. 그래서 각 LoadLibrary 호출마다 FreeLibrary를 한 번 호출해야합니다. 먼저 DLL을 비우지 않는다고 가정하면 LoadLibrary를 호출 할 때마다 동일한 핸들이 제공됩니다. FreeLibrary에 대한 MSDN 문서에서

:

각각의 프로세스는 각각의로드 라이브러리 모듈에 대한 기준 카운트를 유지한다. 이 참조 카운트는 LoadLibrary가 호출 될 때마다 증가되며 FreeLibrary가 호출 될 때마다 감소됩니다. 그들은 같은 DLL 경우

+8

참고 여러 인스턴스를 얻을 수 있지만, 대부분의 사람들은 이것으로 실행되지 않습니다. – Michael

+0

잘 잡습니다. 고마워요, 마이클 –

+1

내 일반적인 정책은 결코 FreeLibrary를 호출하지 않는 것입니다. 따라서 사용자가 필요한만큼 누출하지 않고 동일한 라이브러리에서 여러 번 LoadLibrary를 호출 할 수 있다는 것을 알고있는 것이 좋습니다. (응용 프로그램 종료 전에 얼마나 자주 라이브러리를 언로드하려면 위험이 값보다 큽니다.) – CashCow

6

, 그것은 다시로드되지 않습니다. 지정된 모듈이 이미 호출 프로세스로드되지 않은 DLL 인 경우

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx

는 "시스템은 DLL_PROCESS_ATTACH 값으로 DLL의 DllMain 함수를 호출합니다. DllMain가 TRUE를 반환하면,에서 LoadLibrary가에 대한 핸들을 반환 DllMain이 FALSE를 반환하면 시스템이 DLL을 프로세스 주소 공간에서 언로드하고 LoadLibrary가 NULL을 반환하므로 DllMain에서 LoadLibrary를 호출하는 것이 안전하지 않습니다. 자세한 내용은 DllMain의주의 절을 참조하십시오. "

는 "lpFileName이 경로를 포함하지 않으며, 동일한 기본 이름과 확장자를 가진 두 개 이상의로드 모듈이있는 경우, 함수는 먼저로드 된 모듈에 대한 핸들을 반환합니다."

3

아니, 그렇지 않습니다. 이 문제를 해결하려면 .dll을 .dll을로드해야하는 횟수만큼 임시 파일에 복사 한 다음 완료되면 파일을 삭제할 수 있습니다. 같은 DLL에 해결하는 서로 다른 경로를 사용하는 경우이 가능

관련 문제