首页 > 系统相关 >Windows 隐式加载任意目录下动态库的方法

Windows 隐式加载任意目录下动态库的方法

时间:2024-06-03 18:22:29浏览次数:14  
标签:Cpnt1 hModule Windows Client1 Client2 dll 隐式 加载

windows平台下,dll 的加载方式分为显式加载和隐式加载。

隐式加载需要在程序链接期间指定依赖库的名称、路径等信息,程序运行时由系统自动进行处理;

显式加载则是直接调用系统 API LoadLibrary/FreeLibrary 来加载或卸载 dll 模块。通常情况下,这两种方式可以处理绝大多数的应用需求。

但是在 dll 文件较多时,需要将 dll 分类管理,又不想修改系统环境变量时,我们可以采用”延迟加载“的方式来解决该问题。假设当前的应用的目录结构如下所示:

RootPath
 ├── Basic
 │ ├── Basic1.dll
 │ └── Basic2.dll
 ├── Client1.dll
 ├── Client2.dll
 ├── Components
 │ ├── Cpnt1.dll
 │ └── Cpnt2.dll
 └── MainExE

    MainExE 为应用主程序,依赖 Client1.dll 和 Client2.dll 两个库;

    Client1.dll 和 Client2.dll 分别依赖 Components 目录下的 Cpnt1.dll 和 Cpnt2.dll;

    而 Cpnt1.dll 和 Cpnt2.dll 则依赖 Basic 目录下的 Basic1.dll 和 Basic2.dll。

在程序启动时,系统会首先搜索程序运行时当前目录,找到 Client1.dll 和 Client2.dll。

但是如果没有配置环境变量, Client1.dll 和 Client2.dll 在运行时无法找到 Cpnt1.dll 和 Cpnt2.dll 这两个库,所以我们在编译 Client1.dll 和 Client2.dll 时,

需要在”链接器“-”延迟加载的DLL"这一项中分别添加 “Cpnt1.dll"和”Cpnt2.dll";

同时,在 Client 调用 Cpnt 的方法之前,在 Client 代码中手动调用 LoadLibrary 方法并传入 Cpnt 库的路径,此时就可以成功调用 Cpnt 中的方法。

Cpnt 调用 Basic 也是一样的道理,伪代码如下所示:

#include <windows.h>

// Client1 调用 Cpnt1
void ClientInvokeCpnt() 
{
	HMODULE hModule = LoadLibrary("Components/Cpnt1.dll");

	InvokeCpntFunction();

	if (hModule)
	{
		FreeLibrary(hModule);
	}
}

 

#include <windows.h>

// Cpnt1 调用 Basic1
void CpntInvokeBasic() 
{
	HMODULE hModule = LoadLibrary("../Basic/Basic1.dll");

	InvokeBasicFunction();

	if (hModule)
	{
		FreeLibrary(hModule);
	}
}

 用这种方法则无需修改环境变量。

标签:Cpnt1,hModule,Windows,Client1,Client2,dll,隐式,加载
From: https://www.cnblogs.com/huowenjie/p/18229365

相关文章

  • windows下python源码编译构建grpc【填各种坑】
    背景首先这是巨坑,pipinstallgrpcio和pipinstallgrpcio_tools的方式,因为公司的库里没有,且申请入库复杂,因此只能通过源码构建。思路第一步,应该是要去找grpc的源码,公司是有源码的,也可以在PIPY上找,比如我需要1.41.1的grpc版本,就如下地址https://pypi.org/project/......
  • 在 Windows 10 中全局安装 tree 命令
    在Windows10中全局安装tree命令的步骤如下:1.下载TreeforWindows工具包。可以从官方网站https://gnuwin32.sourceforge.net/packages/tree.htm下载最新版本的Binaries.zip压缩包。2.解压下载的Binaries.zip压缩包。在解压后的文件夹中,找到bin目录,里面有一个......
  • 更改Windows11/10自带的微软拼音输入法的“候选词字体”
    候选字体开启半全角切换快捷键自定义短语自定义短语符号名称符号快捷短语引号「」yh单引号『』yh全角空格×2  kk叉(乘号)×cha六角括号〔〕ljkh超级管理员默认用户名administratoradmin......
  • u-boot 手动从tftp加载镜像执行
    U-Boot确实支持手动从TFTP加载镜像并执行。以下是关于如何在U-Boot中手动从TFTP加载镜像执行的命令和步骤的详细解释:1.**搭建TFTP服务器**:-在你的主机上(通常是Linux系统),你需要首先搭建一个TFTP服务器。这通常涉及到安装TFTP服务软件(如`tftpd-hpa`)并配置其工......
  • C# 模拟http请求出现 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作[windo
    系统里面用到C#模拟Http请求,上线到服务器后,发现日志中大量出现“由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作”或“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”运行netstat-ano发现有大量的Tcp链接,怀疑可能是服务器各种请求太多了导致的服务器是w......
  • windows系统的基本命令
    软件系统软件DOS(DiskOperatingSystem硬盘操作系统),Windows,Linux,Unix,Mac,Android,ios应用软件WPS,QQ,微信,LOL,绝地求生Windows常用快捷键ctrl+C:复制ctrl+V:粘贴ctrl+A:全选ctrl+X:剪切ctrl+Z:撤销ctrl+S:保存Alt+F4:关闭窗口shift+delete:永久删除windows+E:打开资源管理器wi......
  • MYSQL 移机重装步骤(windows11)
     MYSQL移机重装步骤(windows11) 目的:已有电脑A,D盘安装有mysql(安装方式为免安装),准备在另一台电脑B上,复制安装电脑A上的mysql(8.0.23版本)。要求:电脑A的 mysql数据库表都恢复,且设置的用户和密码等都恢复。 步骤: 1 先从电脑A复制mysql文件夹到电脑B的D盘,如:D:\mysql......
  • Windows10系统中安装与配置PyTorch(无GPU版本)
    文章目录1.什么是PyTorch2.PyTorch的安装与配置(无GPU)2.1创建环境2.2安装pytorch库(无GPU)2.3验证安装结果1.什么是PyTorchPyTorch是一种用于构建深度学习模型且功能完备的开源框架,通常用于处理图像识别和语言处理等应用当中的机器学习。PyTorch保留了Torch(L......
  • windows下安装go语言
    前言这阵子因为以后工作的原因,所以开始了go语言的学习之旅,工欲善其事必先利其器,首先就得把go语言环境搭建完成下载Go因为go语言的官网经常打不开,所以我就找了一个镜像网站,里面有很多版本的Go语言,选择自己合适的,比如我的是Windows电脑,所以我选中里面的Windows版本的下载完成......
  • # WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办?
    WIN10/WIN11找不到【应用商店Microsoft.WindowsStore】怎么办?解决方法:1、右键【开始】菜单,点击【WindowsPowerShell(管理员)】,输入:Get-AppxPackage-allusers|SelectName,PackageFullName2、查询到的目录中找到【Microsoft.WindowsStore】,复制后面的可安装版本......