在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); }
标签:
windows
, LoadLibrary
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述