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