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的更多相关文章

  1. Java之——Web项目中DLL文件动态加载方法

    本文转自:https://blog.csdn.net/l1028386804/article/details/53903557 在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来 ...

  2. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集

    本博客中以“C#.Net 如何动态加载与卸载程序集(.dll或者.exe)”开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要 ...

  3. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

    下载 supergraphfiles.exe 示例文件. 应用程序体系结构 在我专攻代码之前,我想谈谈我尝试做的事.您可能记得,SuperGraph 让您从函数列表中进行选择.我希望能够在具体的目录中 ...

  4. Delphi静态加载DLL和动态加载DLL示例

    下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...

  5. 在VC中动态加载ODBC的方法

    在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作.而且,在实际应用中,用户往往 ...

  6. 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法

    在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...

  7. 在ASP.NET中动态加载内容(用户控件和模板)

    在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...

  8. 在MVC应用程序中动态加载PartialView

    原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...

  9. WPF中动态加载XAML中的控件

    原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...

随机推荐

  1. Java源码阅读PriorityQueue

    1类签名与简介 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...

  2. 【Git】Git hangs while unpacking objects (Windows)

    Git hangs while unpacking objects (Windows) 14 Oct 2014 I'm not sure if this is because we're behind ...

  3. 带伪3d的类型的流程画图工具

     Edraw Max    类似:

  4. HTML5 Canvas 绘制库存变化折线 计算出最高最低库存

    <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type&quo ...

  5. 《从零開始学Swift》学习笔记(Day 57)——Swift编码规范之凝视规范:文件凝视、文档凝视、代码凝视、使用地标凝视

    原创文章.欢迎转载.转载请注明:关东升的博客 前面说到Swift凝视的语法有两种:单行凝视(//)和多行凝视(/*...*/).这里来介绍一下他们的使用规范. 1.文件凝视 文件凝视就在每个文件开头加 ...

  6. 【POJ 1080】 Human Gene Functions

    [POJ 1080] Human Gene Functions 相似于最长公共子序列的做法 dp[i][j]表示 str1[i]相应str2[j]时的最大得分 转移方程为 dp[i][j]=max(d ...

  7. 【BIEE】12_查看BIEE的物理SQL

    有时候,我们在使用BIEE的时候回出现一些问题,需要借助物理SQL来进行问题分析.通过物理SQL我们就可以看到BIEE在数据库中是如何去检索出数据库. 查看物理SQL的方式 [登录BIEE]--[管理 ...

  8. (转)JavaScript: in, hasOwnProperty, delete, for/in

    in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point );  //tru ...

  9. GoldenGate Lag For Huge Insert

    前些天客户的ogg延迟到达8小时左右.于是我当时用logdump追踪了一下: 看进程状态: send extsa staus EXTRACT ZBDBA (PID 2269368) Current s ...

  10. Idea Cannot import to svn: Cannot run program "svn"

    svn 出此问题:意味着不可检出代码. 按此修改,重启IDEA即可检出svn代码.