DLL에서 종속 dll 동적 로드

3468 단어 dll
윈도우즈에서 LoadLibrary 함수의 검색 순서는 시스템32 등 시스템 환경 변수 path에 등록된 경로를 먼저 검색한 다음 현재 경로를 검색하는 것입니다.
이곳의 상대 경로는 주exe가 있는 경로를 가리키며 상대 경로는 프로그램 실행 과정에서 변화가 발생할 수 있습니다.
그래서 여기에 구덩이가 하나 있다.
1. 일반적인 x.dll에 대해서는 일반적으로 x.exe와 같은 디렉터리에 있고 x.exe는 직접 LoadLibrary x.dll로 하면 된다.
2, 일반적인 x.dll에 의존하는 xdep.dll, 보통 두 dll도 x.exe와 같은 디렉터리에 있고 x.dll은 직접 LoadLibrary xdep.dll도 가능합니다.
3, COM의 x.dll에 대해 직접 LoadLibrary를 하면 안 됩니다. 왜냐하면 x.dll는 등록이 필요하기 때문입니다. x.dl과 xcomdep.dll의 경로가 반드시 x.exe와 같은 디렉터리에 있는 것은 아닙니다. 이렇게 x.dll에서 LoadLibrary xcomdep를 사용합니다.dll는 실패할 것입니다. x.dll에서 얻은 상대 경로는 x.exe의 상대 경로이고 x.exe 경로 아래에는 xcomdep가 없습니다.dll.
이 문제에 대해서는 다음과 같은 몇 가지 함수로 해결할 수 있다.
//    dll   

HMODULE GetCurrentDllModule()

{

    MEMORY_BASIC_INFORMATION m = {0};

    VirtualQuery(GetCurrentDllModule, &m, sizeof(MEMORY_BASIC_INFORMATION));

    return (HMODULE) m.AllocationBase;

}

//    dll    

//  : e:\test\test.dll

void GetCurrentDllPath(WCHAR* lpwDllPath)

{

    HMODULE hThisMod = GetCurrentDllModule();

    GetModuleFileNameW(hThisMod,lpwDllPath,MAX_PATH);

}

//    dll   

//  : e:\test\

void GetCurrentDllRoute(WCHAR* lpwDllRoute)

{

    GetCurrentDllPath(lpwDllRoute);

    WCHAR* lpwPos = wcsrchr(lpwDllRoute,L'\\');

    *(lpwPos+1) = L'\0';

}

//     dll       dll    

//  :   dll        test_dep.dll

//       :e:\test\test_dep.dll

void GetDepdenceDllPath(const WCHAR* lpcwDepDllName,WCHAR* lpwDepDllPath)

{

    GetCurrentDllRoute(lpwDepDllPath);

    wcscat(lpwDepDllPath,lpcwDepDllName);

}

//     dll     dll

HMODULE LoadDepDll(const WCHAR* lpcwDepDllName)

{

    WCHAR lpwDepDllPath[MAX_PATH];

    GetDepdenceDllPath(lpcwDepDllName,lpwDepDllPath);

    return ::LoadLibraryW(lpwDepDllPath);

}

좋은 웹페이지 즐겨찾기