2014-06-18 3 views
3

LoadLibrary 및 GetProcAddress를 사용하여 dll을로드하려고합니다. LoadLibrary는 유효한 핸들을 반환하지만 GetProcAddress에 대한 호출은 NULL을 반환합니다. GetLastError에 대한 호출은 ERROR_INVALID_PARAMETER 인 87을 반환합니다. GetProcAddress에 전달하는 함수 이름이 dll에 dumpbin /exports을 실행할 때 반환되는 것과 동일한 지 확인했습니다. 불행히도 이것은 작업을위한 것이므로 실제 코드를 포함 할 수는 없습니다. 그러나 여기에 내가하는 일에 대한 아이디어를 줄 수있는 편집 된 버전이 있습니다.NULL을 반환하는 GetProcAddress

HINSTANCE hDLL = NULL; 

hDLL = LoadLibrary(L"<PATH TO DLL>"); 

if (hDLL == NULL) 
{ 
    // error handling code 
} 

g_var1 = (VAR1_TYPE) GetProcAddress(hDLL, L"Function1Name"); 
g_var2 = (VAR2_TYPE) GetProcAddress(hDLL, L"Function2Name"); 

if (!g_var1 || 
    !g_var2) 
{ 
    // error handling code 
} 

저는 SO 및 기타 포럼에 관한 많은 관련 질문을 보았지만 일반적으로 C++ 이름 맹 글링 때문입니다. dumpbin과 같은 이름을 사용하고 있기 때문에 이것이 내 문제라고 생각하지 않습니다. 어떤 아이디어?

UPDATE

은 내가 문제를 좁혀 수 있습니다 생각합니다. 대상에이 dll의 기존 버전이 있습니다 (이것은 임베디드 WinCE 솔루션입니다). 하지만 필자는 필자가 필요로하는 몇 가지 추가 기능이있는 DLL의 최신 버전을 사용해야합니다. unfortuanatley 나는 오래된 DLL을 업데이트 할 수 없습니다. 이 새로운 dll과 dll을 사용하는 응용 프로그램은 대상에로드되는 cab 파일로 압축됩니다. 나는 GetProcAddress를 이전 dll에있는 몇 가지 함수와 함께 시도했고 그 함수가 작동했습니다. 그래서 그것은 비록 내가 LoadLibrary를 새로운 dll에 대한 경로와 함께 호출한다고해도 그것은 이미 타겟에있는 dll을로드하고있는 것처럼 보인다. 누구나 이것이 일어날 것이라고 확신 할 수 있습니까? DLL이 이미로드 된 경우 가 결정할 때 이전 질문 TO

답변은

윈도우 CE가 DLL을로드, 모든 경로 정보는 무시됩니다. 즉, 동일한 이름이지만 다른 경로 인 이있는 DLL은 한 번만로드 할 수 있습니다. 에서 확장자 .cpl로 끝나는 모듈은 확장명이 .dll 인 것으로 간주됩니다.

출처 : http://msdn.microsoft.com/en-us/library/ms886736.aspx

+0

아야! 확실한 해결 방법은 단순히 새로운 버전의 이름을 다른 것으로 변경하는 것입니다. 아마도 CE에 경로를 직접 지정할 수있는 LoadLibraryEx()가 있습니다. 기억이 안납니다. BTW : dependencywalker를 사용하여 바탕 화면의 CE 바이너리를 열 수 있습니다.이 방법은 dumpbin보다 더 편리합니다. –

답변

1

예, 일반적인 함정입니다. DLL에 대한 전체 경로를 제공하지 않으면 LoadLibrary는 이미로드 된 동일한 이름의 DLL에 대한 핸들을 반환합니다. MSDN에서

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

.

LoadLibrary의 절대 경로를 제공하여 원하는 정확한 DLL을 얻을 수 있다고 생각합니다.