2014-09-17 3 views
1

내가 전에 본 적이없는 LoadLibrary와 관련된 문제가 있는데, 처음 본 것은 "C : \ Program Files (x86)"모듈 안에 "nss3.dll"모듈을로드하려고하는 것입니다. \ Mozilla Firefox \ "에서 LoadLibrary를 사용하여 일부 함수를 가져 오지만 0 반환 값으로 실패하면 system32 폴더에서 .dll을 하드 코딩 해 보았습니다.LoadLibrary가 현재 디렉토리에 따라 성공하거나 실패하는 이유는 무엇입니까?

편집 :이 문제를 극복하기위한 방법은 SetCurrentDirectory를 호출 한 다음 .dll에 대한 경로를 지정하지 않고 모듈을 가져 오는 것이지만 그럴 수는 없지만 이유가 무엇인지 알아야합니다. 나를.

편집 : 여기에 몇 가지 조각 (이 작품)입니다 :

var 
    NSSModule: HModule; 
begin 
    SetCurrentDir('C:\Program Files (x86)\Mozilla Firefox'); 
    NSSModule := LoadLibrary('nss3.dll'); 

이하지 않는 일, 왜 아무 생각이 ... :

var 
    NSSModule: HModule; 
begin 
    NSSModule := LoadLibrary('C:\Program Files (x86)\Mozilla Firefox\nss3.dll'); 
+0

Google에 표시하지 않는 코드는 디버깅 할 수 없습니다. 코드가 작동하지 않는 이유를 알아내는 데 도움이 필요하면 ** 코드를 게시하십시오 **. 그때까지 [LoadLibrary] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx)에 대한 MSDN의 설명서를 읽을 수 있습니다. 특히 라이브러리를 찾는 방법에 대한 부분. –

+1

'GetLastError'. –

+0

응용 프로그램이 32 비트 또는 64 비트입니까? ... – jlahd

답변

8

로드중인 DLL은 정적에 노력하고있다 동일한 폴더 (mozglue.dll)에 다른 dll을로드하십시오. 그래서 작업 디렉토리를 설정할 때 작동합니다. 파이어 폭스의 경로가 시스템 경로에 없기 때문에 당신이하지 않으면, API는 DLL을 찾을 수 없다. dll 검색 here에 대한 세부 사항을 찾을 수 있습니다.

2

이 설명은 DLL 자체가 동일한 디렉터리에있는 다른 DLL에 연결된다는 것입니다. 이러한 다른 종속성도로드하지 않고 DLL을로드 할 수 없습니다. 그리고 실패한 종속성을로드하는 것은 로더의 시도입니다.

이 DLL의 예상 호스트는 동일한 디렉토리에있는 Firefox입니다. Firefox가 DLL을로드 할 때 DLL 검색 경로가 실행 파일이 들어있는 디렉토리를 검색하기 때문에 의존성이 성공적으로 해결됩니다. 그러나 프로그램이 모듈을로드하려고 시도하면 실행 파일이 다른 디렉토리에 있기 때문에 종속 모듈을 찾을 수 없습니다.

신고하는 오류 코드는 ERROR_MOD_NOT_FOUND입니다. 이것은로드 한 모듈이 아닌 종속성 중 하나를 참조합니다. 사실 그것은 로더 오류와 공통입니다. 오류 코드는 믿기 어려울 수 있지만 보통 설명은 종속 모듈을 해결하는 오류를 나타냅니다.

작업 디렉토리를 수정하는 것은 해결책이 아닙니다. 문제가 해결되지만 종속성 해결을 위해 작업 디렉토리에 의존해서는 안됩니다. 시스템이 DLL 검색에 영향을주는 메커니즘은 SetDllDirectory 또는 AddDllDirectory입니다. 예 :

MSDN 항목 Dynamic-Link Library Search Order이 필요합니다.

+0

나는 뭔가 다른 것을했는데, nss3.dll을로드하기 전에 mozglue.dll에서 LoadLibrary를 호출했습니다. –

+0

너무 부서지기 쉽습니다. 왜 당신이 표준 방식으로하지 않는지 나는 모른다. –