내가 모든 올바른 서로 다른 주소를 가지고 있어야 각 도서관에 3 개 별개의 핸들과 기능을 반환해야 행에서 같은 DLL 3 회를로드 할 수 을 LoadLibrary는 Win32 API를 사용하는 경우? (아니면 "스마트"뭔가를하고 DLL이 이미 프로세스에로드 된 단지 동일한 모듈을 가리 경우 감지합니까?)LoadLibrary가 고유 한 인스턴스를 생성합니까?
답변
그것은 재치있게 일을 수행합니다. Windows는 LoadLibrary를 통해로드 된 각 DLL에 대한 참조 수를 유지합니다. 그래서 각 LoadLibrary 호출마다 FreeLibrary를 한 번 호출해야합니다. 먼저 DLL을 비우지 않는다고 가정하면 LoadLibrary를 호출 할 때마다 동일한 핸들이 제공됩니다. FreeLibrary에 대한 MSDN 문서에서
:각각의 프로세스는 각각의로드 라이브러리 모듈에 대한 기준 카운트를 유지한다. 이 참조 카운트는 LoadLibrary가 호출 될 때마다 증가되며 FreeLibrary가 호출 될 때마다 감소됩니다. 그들은 같은 DLL 경우
, 그것은 다시로드되지 않습니다. 지정된 모듈이 이미 호출 프로세스로드되지 않은 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이 경로를 포함하지 않으며, 동일한 기본 이름과 확장자를 가진 두 개 이상의로드 모듈이있는 경우, 함수는 먼저로드 된 모듈에 대한 핸들을 반환합니다."
아니, 그렇지 않습니다. 이 문제를 해결하려면 .dll을 .dll을로드해야하는 횟수만큼 임시 파일에 복사 한 다음 완료되면 파일을 삭제할 수 있습니다. 같은 DLL에 해결하는 서로 다른 경로를 사용하는 경우이 가능
- 1. lambda는 호출 될 때마다 새 인스턴스를 생성합니까?
- 2. Vista x64에서 LoadLibrary가 실패합니다.
- 3. HttpContext 내 페이지 인스턴스를 식별하는 고유 한 방법
- 4. 폼 (고유 한 질문) 폼에서 System.Web.UI.WebControls.Table의 인스턴스를 만드는 방법
- 5. C#은 어떻게 클래스의 인스턴스를 생성합니까?
- 6. 부분적으로 고유 한/고유 한 행을 반환합니다.
- 7. 고유 한 대 오라클의 고유 한 키워드
- 8. '고유 한 키'또는 '고유 한 키'색인
- 9. 고유 한 문자열을 고유 한 정수로 변환
- 10. .NET에서 고유 한 스레드마다 고유 한 난수를 생성하는 방법은 무엇입니까?
- 11. 날짜의 고유 한 int
- 12. 테이블에있는 고유 한 값
- 13. 술어와 고유 한 오브젝트
- 14. 고유 한 사용자 서명
- 15. 고유 한 열 적용
- 16. 고유 한 URL plone
- 17. 고유 한 열 수?
- 18. 프롤로그의 고유 한 결과
- 19. 고유 한 암호화 작성
- 20. 고유 한 이름
- 21. 고유 한 문자로 분할
- 22. 고유 한 CSR입니까?
- 23. Fluent NHibernate가있는 고유 한 문자열 테이블
- 24. 백그라운드에서 AVAudioPlayer의 한 인스턴스를 재생합니다.
- 25. 오브젝트를 삭제 한 후에 어떻게 생성합니까?
- 26. 한 번에 전체 난수를 어떻게 생성합니까?
- 27. SQL 얻을 고유 한 달 년 콤보
- 28. 자바에서 고유 한 발신자 정보 추출하기
- 29. 고유 한 페이지 뷰 추적
- 30. MySQL 고유 한 해시 삽입
참고 여러 인스턴스를 얻을 수 있지만, 대부분의 사람들은 이것으로 실행되지 않습니다. – Michael
잘 잡습니다. 고마워요, 마이클 –
내 일반적인 정책은 결코 FreeLibrary를 호출하지 않는 것입니다. 따라서 사용자가 필요한만큼 누출하지 않고 동일한 라이브러리에서 여러 번 LoadLibrary를 호출 할 수 있다는 것을 알고있는 것이 좋습니다. (응용 프로그램 종료 전에 얼마나 자주 라이브러리를 언로드하려면 위험이 값보다 큽니다.) – CashCow