2010-12-09 3 views
1

네이티브 C++로 작성된 DLL이 있습니다. Visual Studio 프로젝트 이름은 MyDll이고 출력 디렉터리에 MyDll.dll이라는 파일로 컴파일됩니다.DLL의 이름을 변경하면이 DLL을 사용하는 코드가 손상됩니다.

편집 후에는 MyDll2.dll으로 이름을 바꿉니다. 이 예제는 어리석은 것처럼 보이지만 이름을 바꿀만한 이유가 있습니다.

C++/CLI로 작성된 두 번째 프로젝트는이 DLL을 사용합니다.

이 프로젝트는 컴파일 타임에 dll에 정의 된 클래스를 사용할 수 있도록 MyDll.lib (MyDll 컴파일시 생성됨)을 참조합니다.

런타임에 DLL을로드하기 위해 LoadLibrary를 호출하여 파일 C:\...\MyDll2.dll의 전체 경로 (실제로는 같은 폴더에 있음)를 전달합니다. LoadLibrary의 반환 값에 표시된대로 성공적으로로드됩니다.

DLL에서 정의 된 클래스를 사용하는 코드에서 처음으로 (스택에있는 객체를 선언하는 것) SEHException으로 충돌합니다 (이러한 예외는 충돌의 원인에 대해 아무런 정보도 제공하지 않습니다 ...).)

이름 바꾸기 단계를 수행하는 경우에만 발생합니다. MyDll.dll으로두고 해당 파일에서 LoadLibrary를 호출하면 모든 것이 잘 동작합니다. 분명히 이름 바꾸기 때문입니다.

왜 그런가? DLL의 이름을 바꿀 수 없습니까?

(편집 : 더 자세한 정보를 제공하여 명확히)

가로드 된 것 후 왜 당신은 DLL 이름을 바꾸는
+1

응용 프로그램에 해당 DLL에 대한 핸들이 있습니까 (Procexp를 사용하여 알 수 있음)? – Benoit

답변

2

dll을 빌드 할 때 링커는 실행 파일에서 링크 할 때 사용하는 lib-file도 생성합니다. 이 lib 파일에는 내 보낸 함수 및 데이터를 가져 오는 dll 이름이 들어 있습니다. 따라서 실행 파일에는 dll이라는 원래 이름에 대한 참조가 있습니다.

1

? LoadLibrary를 호출 한 후에는 DLL의 이름을 바꾸면 안됩니다. OS가 당신에게 그렇게 할 수있게 해주는 것에 놀랐습니다.

+0

나는 그렇지 않습니다. 나는 컴파일 된 후, 실행하기 전에 이름을 바꿉니다. – Laurent

1

경우에 나는 당신이 DLL의 이름을 바꿀 때

이 예 음주의에서 LoadLibrary() 인수를 변경해야합니다 파일 이름을 변경하려면 다시 컴파일해야합니다. 실제 문제를 해결하면 LoadLibrary()의 반환 값을 전혀 확인하지 않은 것처럼 들립니다. NULL을 반환하면 Win32Exception을 던집니다.

+0

명백히 인수는 DLL의 실제 이름입니다 ...로드가 잘됩니다. 성공을 나타내는 반환 값을 확인합니다.그러나 나중에 DLL의 클래스를 사용하면 SEHException과 함께 실패합니다. – Laurent

+0

나는 아무것도 볼 필요가 없다. 일부 코드 스 니펫과 예외의 ToString() 값을 게시하여 질문을 개선하십시오. –

+0

질문에 세부 사항을 추가했습니다. 예외의 ToString에는 '알 수없는 오류'를 의미하는 오류 코드를 제외한 정보가 거의 포함되어 있지 않습니다 (필요한 경우 나중에 게시합니다). 또한 코드가있는 PC에 돌아 왔을 때 미리보기를 추가 할 것입니다. 감사. – Laurent

1

나는 Edwin에 동의합니다. lib 파일은 export 된 함수에 대한 지시어이며 컴파일시에 dll의 이름을 포함합니다.

0

누구도 1 년 후에 이것을 읽을 지 모르지만 OP가 이미 정적으로 링크되었을 때이 이름이 바뀐 dll을 LoadLibrarying하는 이유는 무엇입니까? 이것은 2 가지 다른 것들입니다. 나는 OP의 응용 프로그램이 정적 링크 후에 필요한 MyLib.dll 부족 때문에 충돌하고 LoadLibrary는 그와 아무 관계가 없다고 생각합니다. OP는 MyLib2.dll의 LoadLibrary도 생략 할 수 있으며 그 결과는 정확히 동일합니다. 설명 할 수없는 것은 알려지지 않은 오류입니다.

관련 문제