动态链接库编程--个人笔记

动态链接库调用(包含demo):qt+vs2013编程之动态链接库 先上例程demo下载https://download.youkuaiyun.com/download/zhy808zhy/11182444 作为初学者,对动态链接库的具体应用很模糊,这里作者利用qt和vs2013进行联合编程,C++实现算法生成动态链接库,qt用来做界面。 因为作者利用vs2013作为平台编写qt程序,因此C++调用动态链接库与本例程做法一致。如果不使用qt的小伙伴可以忽略qt部分,直接用... 阅读详情

1. 动态链接库概述 (静态库和动态库、动态链接库的加载)
概述: Windows API中的所有函数都包含在DLL中.其中有三个最重要的DLL:
         Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;
         Uer32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;
         GDI32.dll,它包含用于画图和显示文本的各个函数.
2.静态库和动态库
    静态库:函数和数据被编译进一个二进制文件(通常扩展名为.LIB).在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE 文件),发布产品的时候不需要包含静态库
    动态库:在使用动态库的时候,往往提供两个文件:一个引入库.lib和一个DLL。  引入库包含被DLL 导出的函数和变量的符号名,DLL 包含实际的函数和数据。

3.动态链接库的加载

    隐式加载(需要.lib文件,包含头文件。 同时还需要DLL文件,程序启动的时候就把动态库的函数全部加载到内存中了)

    显示加载(需要DLL文件,需要时才加载,利用LoadLibrary,GetProcAddress函数实现)

4.通用动态链接库模板

     这种模式的.h文件,可以适用于导入函数,也可以适用于导出函数

     在源文件中包含.h,如果源文件中定义了DLL_API  ”_declspec(dllexport)“ 那么在.h中就不定义了,可以用于导出函数的声明,而如果在调用dll的程序中包含这个头就可以,因为程序中没有定义DLL_API,所以DLL_API被定义为 "_declspec(dllimport)" 这时作为导入函数的声明了,

   Dll.h文件内容

#ifdef DLL_API
#else
#define DLL_API _declspec(dllimport)
#endif
DLL_API int Add(int x,int y);
DLL_API int Subtract(int x,int y);

   cpp文件内容

#define DLL_API _declspec(dllexport)
#include "Dll.h"
int add(int x,int y)
{
return x+y;
}
int subtract(int x,int y)
{
return x-y;
}

5.查看动态链接库工具

    Dumpbin (字符界面工具)

           dumpbin –imports ***.exe //查看导入函数

           dumpbin -exports ***.dll //查看导出函数

    Depends(图形界面工具)

6.从 DLL 中导出C++类

     在一个动态链接库中不仅可以导出函数,还可以导出一个C++类,代码示例如下:
class DLL_API point
{
public:
void output(int x,int y);
void test(int a,int b);
};
     如果只想导出类中的部分函数,则可以将DLL_API剪切至该函数前面。如void DLL_API output(int x,int y);

     如果函数在类中被声明为private,或protect,是无法导出使用的

7.解决名字改编问题

       C++导出或导入动态链接库的函数时会发生名字改编。如果不想发生名字改编。就需要在定义导出函数时,加上限定符:extern “C”.注意:双引号中的C 必须是大写.
         #define DLL_API extern "C" _declspec(dllexport)
       利用限定符:extern “C”可以解决C++和C 语言之间相互调用时函数命名的问题.但是这种方法有一个缺陷:不能用于导出一个类的成员函数,只能用户导出全局函数这种情况.另外,如果导出函数的调用约定发生了改变,那么即使使用了限定符,名字一样会发生改编.
       这种情况下,可以通过一个称为模块定义文件(DEF)的方式来解决名字改编的问题.接下来,添加一个模块定义文件"**.def”,并写入如下代码:
LIBRARY DLL** //dll文件的名称
EXPORTS
add
subtract
   其中,LIBRARY 语句用来指定动态链接库的内部名称,该名称与生成的动态链接库的名称一定要匹配.
           EXPORTS的作用是表明DLL 将要导出的函数,以及为这些导出函数指定的符号名.
   如果要将导出的符号名和源文件中定义的函数名不一样,则可以按照一下语法指定导出的函数:
               entryname=internalname  //前面代表符号名,后面代表函数名
    其中, entryname项是导出的符号名, internalname项是DLL中将要导出的函数名字

8.显示加载方式加载DLL

      使用动态方式加载动态链接库时,需要用到LoadLibrary函数.该函数的作用是将指定的可执行模块映射到调用进程的地址空间.原型如下:
             HMODULE LoadLibrary( LPCTSTR lpFileName );
     该函数返回类型是HMODULE,HMOUDULE类型和HINSTANCE 类型可以通用.当获取到动态链接库模块的句柄后,接着需要获取该动态链接库中导出函数的地址,这可以通过调用GetProcAddress 函数实现,原型如下:
           FARPORC GetProcAddress (HMODULE hModule, LPCSTR lpProcName);
下面,就利用DllTest程序动态加载Dll2.dll并访问它提供的导出函数.代码如下:
void CDllTestDlg::OnBtnAdd()
{
HINSTANCE hInst;
hInst=LoadLibrary("Dll3.dll");
typedef int (/*_stdcall*/ *ADDPROC)(int a,int b);  //定义的必须是函数指针,用来接收地址
//ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"");  //函数名称,必须是dll导出函数的名称,                     ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1)); //通过序号来加载,要用MAKEINTRESOURCE来转换
if(!Add)
{
MessageBox("获取函数地址失败!");
return;
}
CString str;
str.Format("5+3=%d",Add(5,3));
MessageBox(str);
}
说明:
   这里的ADDPROC 是一个函数指针类型,而不是一个变量.
   动态加载DLL 时,客户端程序不再需要包含导出函数声明的头文件和引入库文件,只需要带dll文件即可.

9.DllMain 函数
Dll文件的入口函数:DllMain.该函数是可选的.原型如下:
        BOOL WINAPI DllMain( HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved);
注意:

    如果提供了DllMain 函数,那么在此函数中不要进行太复杂的调用,因为在加载该动态链接库时,可能还有一些核心动态链接库没有加载,比如user32.dll和GDI32.dll等,由于我们自己的dll会比较靠前的加载,而某些核心没被加载的话,就可能调用失败.

     当我们的动态链接库不再使用时可以调用FreeLibrary 使动态链接库使用计数减1,当使用计数为零时,系统会收回模块资源.

原型如下:
        BOOL FreeLibrary( HMODULE hModule);

VC++动态链接库编程之DLL典型实例源代码下载 VC++动态链接库编程之DLL典型实例源代码下载 VC++动态链接库编程之DLL典型实例源代码下载 VC++动态链接库编程之DLL典型实例源代码下载 VC++动态链接库编程之DLL典型实例源代码下载 VC++动态链接库编程之DLL典型实例源代码下载 立即下载

相关推荐

DLL动态链接库编程入门(5文件)

包含五个文档代码,详细介绍DLL ,MFC规则下, 非MFC规则 等。 物超所值!!

[速成] Visual Studio C/C++创建Dll(动态链接库)并调用

Visual Studio C/C++创建Dll(动态链接库)并调用(函数与对象的导出和导入).

software_metagalaxy的博客 8691

Obsidian笔记同步实战:基于Git的私有化部署与自动化管理

本文详细介绍了如何利用Git为Obsidian笔记构建私有化、自动化且免费的同步方案。通过安装配置Git与Obsidian-git插件,结合Gitee等远程仓库,实现笔记的版本管理、多设备同步与自动备份,打造安全可靠的知识管理体系。

y7z8a的博客 272

DLL动态链接库的创建与使用(实例教程)

DLL动态链接库的创建与使用,对新手友好的教程

Elaine的博客 6995

KVNAND架构:解决边缘设备部署LLM的内存与带宽挑战

大语言模型(LLM)在边缘设备部署时面临内存容量和带宽限制的核心挑战。传统方案依赖DRAM存储KV缓存,导致高昂成本和性能瓶颈。闪存计算(IFC)通过计算单元下沉和流水线优化缓解部分问题,但仍受限于DRAM依赖。KVNAND架构创新性地将KV缓存直接存储在3D NAND闪存中,结合异构计算和页面级KV映射技术,显著降低延迟和能耗。该架构特别适用于长上下文场景,如文档分析和个人助理应用,能有效解决内存溢出(OOM)问题并提升计算单元利用率。关键技术包括头组并行(HG)执行和混合键合设计,为边缘AI部署提供了新

weixin_27215337的博客 320

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3117

学懂C++(五十七): C++ 动态链接库(DLL)开发详解

学懂C++: C++ 动态链接库(DLL)开发详解

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 5746

基于阻抗控制的工业机器人轨迹跟踪系统 Simulink/Simscape 仿真

  本文是对文献 [1] 的复现。 关于阻抗控制   阻抗控制的提出可以追溯到 1984 年,Neville Hogan 在 American Control Conference 发表的 Impedance Control:An Approach to Manipulation ,次年,Hogan N. 又在 Journal of Dynamic Systems Measurement and Control-transactions of The Asme 发表了阻抗控制经典三部曲 —— Imped.

-贝塔- 的博客 2万+

动态链接库编程

动态链接库编程 一。引入:     为了使多个程序员协作开发程序,负责底层功能的程序员使用动态链接库实现具体功能,负责用户界面设计的程序员在项目中引用动态链接库,并调用其中的具体功能,这样就可以使程序具有很好的模块化结构,便于定位和调试问题。   二。扩展名解释:         dll – Dynamic-link library – 动态链接库 1. dll –- 共享库 2

Neicole ~~ 学习旅程(大学) 3589

海康威视国内版监控设备改英文界面难题:原因解析与解决方案

跨境安防设备部署中,国内采购的海康威视监控设备常因仅支持中文界面导致海外用户无法操作。本文剖析了该问题的核心原因:海康威视对国内版和海外版设备实行区域锁定策略,国内版固件仅内置中文且无法通过常规方式切换语言。针对此问题,文章提供了三种解决方案:1)官方合规的海外版固件更换;2)低成本的操作界面翻译与远程协助;3)长期更换海外版设备的彻底解决方案。同时给出了跨境采购的注意事项,强调应提前确认设备版本、拒绝非官方改造并预留适配时间。

海康威视技术支持 3951

IDEA 导入 jbolt项目(实验室非公开项目)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录准备一、准备数据库二、IDEA导入jbolt项目 准备 在实验室群文件中下载jbolt.zip和mysql.sql两个文件 将其解压到自己的目录下 一、准备数据库 打开Navicat新建一个jbolt数据库(字符集为utf8) 导入mysql.sql文件 数据库导入完毕 二、IDEA导入jbolt项目 点击打开一个项目 选择jbolt文件夹 以Maven形式打开 打开pom.xml 在里面添加jetty-server依赖

weixin_44094842的博客 973

深入浅出Visual C++动态链接库(Dll)编程

[转载]深入浅出Visual C++动态链接库(Dll)编程文章作者:宋宝华信息来源:天极网原始连接: http://soft.yesky.com/lesson/318/2166818.shtml?412  动态链接库(DLL)是Windows系统的核心,也是COM技术的基础,因此突破动态链接库一直是技术人员的攻坚目标,本期专题将由浅入深的介绍动态链接库的基础慨念、分类、实现和应用。基础慨念1.概

sharkw的专栏 4024

7.5华为OD机试真题 新系统 - 省超足球比赛获胜队伍计算 (Java/Py/C/C++/Js/Go)

7.5华为OD机试真题 新系统 - 省超足球比赛获胜队伍计算 (Java/Py/C/C++/Js/Go)

算法大师! 818

动态链接库

C语言动态链接库1. 概述1.1 静态库和动态库1.2 动态链接库的优点2. 生成动态链接库2.1 windows版本2.2 Linux版本3. 调用动态链接库3.1 windows版本3.1.1 隐式调用3.1.2 显示调用(推荐)3.2 Linux版本 1. 概述 在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。 1.1 静态库和动态库 静态库:这类库...

liaoshenhao的博客 1万+

MIL图像处理那些事:MIL的安装和MIL工具箱

MIL图像处理那些事:MIL的安装和测试,如何用C#使用MIL

十多年IT经验,专注机器视觉,智能制造半导体行业 5273

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Windows 动态链接库编程

 Windows 动态链接库编程作者:终南   li.zhongnan@hotmail.com> 1、介绍Windows操作系统是应用最关的操作系统,因此动态链接库也为程序员所熟悉,即使对于普通的使用者来说,很多时候也会碰到.dll结尾的文件,这就是动态链接库文件。Windows下的动态链接库可以通过参考头文件和.lib库文件进行编译,从而使得动态链接库隐式地被

终南的IT空间 8983

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

WIN32核心编程 - 动态链接库

动态链接库(DLL)导出函数导入库代码重用模块化内存效率。

0xCC说逆向 1109

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC++ 动态链接库编程

转自http://blog.163.com/airton@188/blog/static/1018619820079251459659/ VC++动态链接库编程   1.概论    先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-

HHXUN的博客 3189

Qt中的动态链接库编程

1:Qt中的动态链接库编程     使用C++面向对象的类编写DLL是要注意很多细节的,主要是二进制(ABI)兼容问题。COM是一个很成功的例子,只要符合COM的规范,我们就能编写出很好的DLL来,然而COM是微软私生的,要想跨平台,我们还得另找它路。     Qt 的跨平台特性同样令人兽血沸腾。如果你认为QT仅仅是一个跨平台界面库,那就小看它了。我要说的是,它不但是一个通用的跨平台的面向对

晴天的专栏 1810

VC++动态链接库(DLL)编程(一)

VC++动态链接库(DLL)编程(一) ――理解库 作者:宋宝华  e-mail:21cnbao@21cn.com 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方

todototry的专栏 2750

动态链接库编程笔记

我们平时所做的大部分开发都是二次开发,会使用卖方提供的SDK,SDK中只有接口,没有具体业务逻辑实现的代码,我们在SDK接口的基础上做开发,进而实现我们想要的功能。        首先我们来说说静态链接库和动态链接库,静态链接库往往以lib后缀结尾,动态链接库往往以dll后缀结束,但是我们不能仅仅以后缀名作为它们二者的区别。比如动态链接库也存在lib后缀的文件,但是此时的lib文件只是保存一些函

tf_apologize的博客 638

深入浅出:Linux C编程中如何使用动态链接库

在一些大型项目的开发中,代码复用是很常见的情况,各个模块经常会使用一些通用功能。为了提高代码质量,减少代码冗余,一般会引入公共的模块库,将通用函数写入其中。动态链接库就是这样的一个公共的模块库,它不仅可以降低模块之间的耦合,还可以将其发布出去,供他人使用。 0x10 动态链接库的生成和使用 动态链接库只是一些函数的实现,供第三方调用。从宏观角度上来说,需要以下两个文件 头文件,主要是函数的一些声...

个人笔记 5080
上一篇: 动态链接库编程--个人笔记
下一篇: 窗口、线程、超类、子类
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值