在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 = {};
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+) = 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);
}
在DLL中动态加载其所依赖的dll的更多相关文章
- Java之——Web项目中DLL文件动态加载方法
本文转自:https://blog.csdn.net/l1028386804/article/details/53903557 在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来 ...
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集
本博客中以“C#.Net 如何动态加载与卸载程序集(.dll或者.exe)”开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要 ...
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序
下载 supergraphfiles.exe 示例文件. 应用程序体系结构 在我专攻代码之前,我想谈谈我尝试做的事.您可能记得,SuperGraph 让您从函数列表中进行选择.我希望能够在具体的目录中 ...
- Delphi静态加载DLL和动态加载DLL示例
下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...
- 在VC中动态加载ODBC的方法
在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作.而且,在实际应用中,用户往往 ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- 在ASP.NET中动态加载内容(用户控件和模板)
在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...
- 在MVC应用程序中动态加载PartialView
原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
随机推荐
- centos7服务器基本的安全设置
在使用云服务器的过程中经常会遇到很多非法的入侵试图登录服务器,所以我们需要对服务器进行安全防范 关闭ping扫描,虽然没什么卵用 先切换到root echo 1 > /proc/sys/net/ ...
- window7访问虚拟机ubuntu中的mysql
window7上面下载mysql很麻烦,不喜欢,所以改用虚拟机安装ubuntu系统,提供mysql服务. 第一步:下载vmware workstation12, 第二步:下载ubuntu镜像,我用的是 ...
- struts2设置文件上传大小
利用struts2想要设置或者限制上传文件的大小,可以在struts.xml配置文件里面进行如下配置: <constant name="struts.multipart.maxSize ...
- hbase shell删除键不听使唤
用Xshell登陆linux主机后,在hbase shell下死活不能使用backspace和delete删除误输的指令,只得不停退出,重登,仔细输..又错了,再退出,再登,仔细输...又错了...又 ...
- IDEA+MAVEN+testNG(reportNG)
转载:http://www.cnblogs.com/aikachin/p/7765846.html 参考: http://blog.csdn.net/langsand/article/details/ ...
- HTML5 Canvas 绘制库存变化折线
<!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type&quo ...
- Rails生成随机字符串及加解密
1.生成安全的base64字符串 key = SecureRandom.urlsafe_base64
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面快速入门 TC3
右击添加一个PLC项,注意不要用中文 右击VISUs,添加一个视图对象 在POUs中打开MAIN,然后添加代码(定义了一个BOOL和一个INT类型变量) 工具箱中得到一个textfield ...
- 小米miui系统怎么关闭文件管理里的热门视频和表情?
小米miui系统怎么关闭文件管理里的热门视频和表情? 打开"文件管理"后,切换到"手机"选项卡. 然后,点击屏幕右上角的一排竖点. . 在弹出的菜单中点击&qu ...
- Hibernate单向“一对多”关联
1. 基于连接表的单向“一对多”关联,应该优先被采用其中指定many-to-many的unique="true",为单向“一对多”,不指定就是单向“多对多” <class n ...