2011-09-06 2 views
0

내가 작성한 프로그램 (C#)은 C++/CLI 래퍼 라이브러리를 통해 액세스했습니다.이 라이브러리는 필자도 썼습니다.예기치 않게 동일한 응용 프로그램에서 Windows DLL이 두 번 이상로드됩니다.

네이티브 라이브러리의 DllMain 메서드가 두 번 이상 호출되었으며 디버거에서 여러 메모리 위치가 일부 라이브러리 호출에 연결되어 있다고 생각했습니다. 내가 본 것으로부터, 라이브러리는 두 번 이상 초기화 (그리고 메모리 할당)됩니다.

내 코드가 LoadLibrary와 같은 함수를 사용하지 않고 라이브러리의 .h 파일과 .lib를 포함하여 dll이 사용되는 경우 왜 두 번 이상 초기화되며이를 피하려면 어떻게해야합니까?

+0

스택 추적을 게시하십시오. –

답변

1

AFAIK DLL은 동일한 주소 공간에 두 번 이상로드 할 수 없습니다. LoadLibrary을 명시 적으로 호출하더라도 DLL은 두 번 이상로드되지 않고 참조 카운터가 증가합니다.

또한 "디버거가 여러 메모리 위치가 라이브러리 호출 중 하나 인에 연결되어 있다고 생각하는 것이 정확히 무엇인지 이해하지 못합니다." 가져온 기호 하나 (함수 또는 변수 주소)는 DLL 바인딩 중에 하나의 주소로 채워집니다.

  • 당신은 동일한 라이브러리 (여러 DLL 파일) 동시에 여러 버전을로드 할 수 있습니다 :

    나는 다음 중 하나를 믿습니다. 일반적인 오류는 디버그를로드하고 DLL 버전을 동시에 릴리스하는 것입니다.

  • DllMain이 여러 번 호출되었지만 여러 번로드되었음을 의미하지는 않습니다. DllMain에 제공된 매개 변수를 확인합니까? DLL_PROCESS_ATTACH입니까, 아니면 그냥 DLL_THREAD_ATTACH/DLL_THREAD_DETACH입니까?
+0

"디버거에서는 여러 메모리 위치가 라이브러리 호출 중 일부에 연결되어 있다고 생각합니다."나는 Visual Studio의 시스템을 사용하여 실행 커서를 이동하는 데 사용 된 이상한 사실을 참조합니다 (다음에 실행할 프로그램 줄을 선택할 수있는 함수) 일부 함수 호출에서 커서를 움직일 때 Visual Studio는 내가 이동해야하는 동일한 함수의 버전을 지정하라는 요청을 받았으며 다른 주소를 가진 라이브러리 사본 세 개를 제공합니다. 함수 자체는 어떤 식 으로든 과부하되거나 다형성을 갖지 않습니다. –

+0

@ 화성에있는 커피 : 오, 알았어요. 100 % 확실히 템플릿 함수가 아니거나 뭐니 뭐니해도, 아마 여러 DLL 버전이 동시에로드 될 것입니다. – valdo

+0

마침내 문제를 다시 해결할 수있었습니다. 스레드/프로세스 첨부 때문에 다중 호출이 발생한 것으로 보입니다. 문제는 분명히 여러 호출 스레드 때문이었습니다. –

1

DLL의 진입 점은 프로세스에 처음로드 될 때뿐만 아니라 프로세스의 스레드가 시작되거나 중지 될 때 호출됩니다.

DLLMain에 문제가있는 경우 check the reason for DLL entry이 필요하고 적절하게 처리해야합니다.

관련 문제