在DLL中动态加载其所依赖的dll

windows下LoadLibrary函数的搜索顺序是先搜索system32等系统环境变量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);
}

 

posted @ 2014-05-06 10:41  *神气*  阅读(2840)  评论(0编辑  收藏  举报