DLL的基础知识和第一个DLL程序

qt dll的调用及与主程序的交互 近期,研究了下将qt程序封装成dll,与其他程序(mfc、c#)进行调用交互,主要涉及几个方面内容: 一、qt生成dll 按照qt官方引导,可以很简单的生成dll,但是此类dll只能与qt程序进行交互;由于qt 的事件循环机制与windows寻坏机制不同,要想在其他程序中启动qt的dll,必须加入QApplication,以启动qt的事件循环机制。 通过官方发布的qtwinmigrate文件 阅读详情

该文章讲述了dll的基本知识、dll的工程建立和使用dll两种方式实现在应用程序中使用dll的导出函数。

一、DLL的简单介绍

1. DLL定义

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。[引用百度百科]

2. DLL特点

由DLL定义可知,DLL特点有:

1)扩展了应用程序的特性。DLL可以被动态地载入到进程的地址空间中。

2)简化了项目管理,可以让不同的开发团队管理不同的模块。

3)有助于节省内存。一个dll可被多个程序共享。多个程序调用同一个dll内的同一个函数时,系统却只需将该dll加载一次。

4)促进资源共享。

5)促进了本地化。可以使应用程序只包含代码但不包含用户界面组件。

6)有助于解决平台间差异。使用延迟加载机制,程序仅仅加载需要的函数,使程序可以在老版本的系统中运行,可不是在某些函数不被兼容时拒绝运行。

7)可以用于特殊目的。如钩子函数等等。 

3. DLL的标准搜索路径

1)可执行文件目录。

2)windows系统目录。

3)windows目录的System目录。

4)windows目录。

5)进程当前目录。

6)PATH环境变量所列出的目录。

4. DLL加载方式

DLL加载方式有隐式链接(需要.dll,.lib,.h)和显式链接(需要.dll)。隐式链接就是在程序开始执行时就将DLL文件加载到内存当中,而显示链接,是实时加载,程序需要的时候加载,不需要的时候,卸载。只要没有在程序中显式链接的,都是隐式链接。

·隐式链接(静态链接)中,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。

·显示链接(动态链接)中,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式

1)隐式链接(需要.dll,.lib,.h)

a。将dll工程下的dll和lib文件拷到测试工程下

b。同时编写头文件.h【头文件书写导入函数】
//_declspec(dllimport)说明函数为导入函数
extern "C" _declspec(dllimport) int Max(int a, int b);           
extern "C" _declspec(dllimport) int Min(int a, int b);

c。编写实现文件.cpp
#include "test.h"
#include <iostream>
using namespace std;
// 可写全路径
#pragma comment(lib,"TestDLL001.lib")
int main()
{
 int a=Min(3,4);
 cout<<a<<endl;
 system("pause");
 return 0;
}
--------------------- 
作者:red10057 
来源:优快云 
原文:https://blog.youkuaiyun.com/red10057/article/details/7394213 

.lib文件对应的搜索路径如下:

1、项目当前目录.cpp目录(项目和解决方案的Debug不行)(也不是解决方案目录)

2、VC设置中的库目录(Library Directories)

3、如果lib库不放到搜索路径中,也可以在程序中添加:     

#pragma comment(lib,"D:/DLLTest.lib")//若是相对路径,则为项目当前.cpp目录

2)显式链接(需要.dll)【必须在生成该dll文件时 extern "C"】

a。将dll工程下的dll文件拷贝到测试工程下

b。编写实现文件.cpp
#include <Windows.h>                  // 包含 HINSTANCE
#include <iostream>
using namespace std;

int main()
{
// 必须在生成该dll文件时 extern "C";
 HINSTANCE his = LoadLibraryA("TestDLL001.dll");                    //用于加载dll
 typedef int(*pmin)(int a, int b);          
 pmin mmi=(pmin)GetProcAddress(his, "Min");            //GetProcAddress()用于获得函数地址
 // !!!这是要通过函数名得到对应函数地址后才可以调用该函数操作,与静态链接方式相比,感觉有点麻烦
 // 尝试一下是否可以有其他方式调用
 int aa=mmi(3,4);
 cout<<aa<<endl;
 FreeLibrary(his);                                                   //释放dll
 system("pause");
 return 0;
}
--------------------- 
作者:red10057 
来源:优快云 
原文:https://blog.youkuaiyun.com/red10057/article/details/7394213 

5. 个人理解

综上所述,我理解DLL类似一个模块,DLL里面包含了函数实现方式。不妨定义test.dll中包含函数add,当一个应用程序需要调用test.dll的add函数时,无需将add函数实现代码写进该exe的源代码中,可通过上述2种方式加载test.dll后直接调用该dll的add函数,这样其实也是实现了代码重用,假设add函数是很多个应用程序都要用的,无需将add函数代码写到这些应用程序的源代码中,只需将test.dll放到工作目录下即可。

二、第一个DLL程序

加入代码例子的讲解可以加深对DLL的认识~o( =∩ω∩= )m

如果看到这还是对DLL陌生,额,我觉得这是很正常的现象,因为当初我在学DLL时看了很多篇相关文章也是对DLL陌生,直到我写了第一个DLL程序,我才开始熟悉DLL,原来DLL是这回事呀~所以还是多撸代码吧٩(๑>◡<๑)۶ 

1. 新建一个DLL工程

实验环境:vs2008+win7 x64

至此,一个dll工程已经建立。其目录如下:

其中,dllmain.cpp是DLL程序入口点函数,其详细内容可见https://blog.youkuaiyun.com/Quellaaa/article/details/83992244

testDll.h和testDll.cpp文件用于声明和定义导出函数。

导出函数的声明方式:

  1)一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
  2)另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:
  LIBRARY 库工程名称
  EXPORTS 导出函数名

2. 第一个DLL程序

第一个DLL程序用于实现导出函数,并在exe中使用~

(可用vs自带的dumpbin.exe查看导出函数表,使用方式请戳→https://blog.youkuaiyun.com/Quellaaa/article/details/81300449)

编译:

编译得到的结果:

查看testDll.dll的导出函数表:

由上图可知,成功将新增的两个函数导出。

接下来将dll运用到exe中:

1)静态链接

将该testDll.dll、testDll.lib和testDll.h文件放在exe工程目录下:

testUseDll.cpp代码:

执行结果如下:

2)动态链接

这里有个类,好像直接按上面讲述的动态链接方法走不通,emmm……先把普通函数的动态链接方式写了,类的动态链接研究学习后就写在另外一个博客啦~类的静态链接dll文件是没有问题哒~(o´ω`o)ノ

以extern "C"模式生成dll,即改为#define TESTDLL_API  extern "C" __declspec(dllexport)

只需将生成的testDll.dll放入到工程目录下,testUseDll.cpp代码如下:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	HINSTANCE hIs = LoadLibrary(_T("testDll.dll"));
	typedef int (*fun)(int, int);
	fun  Add= (fun)GetProcAddress(hIs, "Add");
	cout << Add(1, 2)<<endl;
	return 0;
}

执行结果如下:

以上,就是这篇文章全部内容。若有不对之处,欢迎指正。(。⊙౪⊙。)

(ノ◕ω◕)ノ若对你有帮助,可以顶一下哟~XD

C++程序注册Dll 前两天写个程序,引用的dll首次运行的时候,需要手动注册(貌似是个activex dll)。于是想个办法,用C++程序实现。 注册要在dos窗口中,那么是不是要在程序中用shellexcute执行命令行(使用方法见我的博文)。 看了很多资料,发现,shellexcute只能执行一个命令(打开文件,运行某个应用程序等)。 接着就找到写bat文件的方法: @echo off regsvr3 阅读详情

相关推荐

dll的创建和调用

动态链接库英文为DLL,是Dynamic Link Library的缩写。dll是一个被其他应用程序调用的程序模块,其中封装了可以被调用的资源或函数。它是依附于EXE文件创建的的进程来执行的,不能够单独运行。每个程序都可以通过包含dll使用dll中包含的功能,这有助于避免代码重用和促进内存的有效使用。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

好好学习 1169

第一个DLL程序:动态链接库DLL教程,30分钟快速上手

DLL 程序的入口函数是 DllMain(),就像 DOS 程序的入口函数是 main()、Win32 程序的入口函数是 WinMain() 一样。前面我们一直在讲的就是DOS程序。 DllMain() 函数的原型为: BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVO

u010154760的专栏 854

如何编辑和编程 DLL 文件

在开始编辑和编程 DLL 文件之前,你需要了解 DLL 文件的结构和功能。完成 DLL 代码的编写后,使用开发工具的编译器编译项目,并生成 DLL 文件。你需要了解 DLL 文件的结构和功能,选择合适的开发工具和环境,创建 DLL 项目,编写 DLL 代码,编译和生成 DLL 文件,然后在其他程序中使用 DLL 文件。其他程序可以通过加载 DLL 文件,并调用其中的函数来使用 DLL 提供的功能。DLL 文件提供了一种方便的方式来共享代码和函数库,从而提高代码的重用性和软件开发的效率。

TechChamp的博客 9226

zz DLL 编写教程

DLL的优点 简单的说,dll有以下几个优点: 1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。 2) 不需编译的软件系统升级,若一个软件系统使用了dll,则该

1074

掌握MFC程序运行所需DLL

mfcXX.dll是Microsoft Foundation Classes (MFC)库的一部分,提供了一套丰富的C++类库,用于创建Windows应用程序。这些类库封装了大量Windows API的复杂性,使得开发者可以更加便捷地进行应用开发。mfcXX.dll的功能包括但不限于:用户界面元素的封装:包括窗口、控件以及与用户交互的图形元素。文档/视图结构:为文档编辑和显示提供基本框架。图形和打印支持:提供绘图和打印功能。应用程序和多线程服务。

weixin_42361478的博客 908

DLL发展历史

本文详细介绍了DLL的发展概况,从DLL发展之初至今分了多个环节进行详细概述

DLL的前世今因

网上的有关DLL的文章有很多,也很杂。这里我花了一段时间,查了资料,把各种版本自己动手试了试。以下是我的学习笔记,希望对大家有所帮助。 DLL:动态链接库。 动态链接库就是一种别人已经写好的代码(一般是函数或类),并且已经编译和链接好了,我们只是需要按照一定的规则就可以使用这些代码。 并且动态链接库是可以进行跨语言的。就是说C的DLL可以在Java中使用。 DLL是与exe分开的,

u013696062的专栏 1032

Windows API函数大全(完整)

Windows API函数大全,从事软件开发的朋友可以参考下

.dll简介

词源简介 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展” 概念简介 在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地...

DarkUniX的博客 776

海康威视iVMS-4200在银河麒麟系统部署全攻略与疑难排解

在信创国产化进程中,软件兼容性是关键挑战之一。以安防监控领域广泛使用的海康威视iVMS-4200客户端为例,其从Windows环境迁移到银河麒麟等国产操作系统时,面临架构适配、依赖库匹配等核心兼容性问题。这涉及到跨平台软件部署的通用原理:不同CPU架构(如ARM的飞腾、x86的兆芯)和操作系统底层API的差异,要求软件必须进行针对性编译和优化。解决这类问题的技术价值在于保障专业软件在国产化环境中的稳定运行,是信创产业落地的重要环节。具体到应用场景,如在基于银河麒麟V10的安防监控项目中,通过获取对应架构的.

weixin_33423874的博客 1435

超融合架构实战:如何用3节点搭建企业级分布式存储系统?

本文详细介绍了如何利用3节点搭建企业级分布式存储系统的超融合架构实战指南。从硬件选型、网络配置到存储策略调优,提供了全面的实操建议和性能优化技巧,帮助企业实现高效、弹性的IT基础设施。特别适合需要简化运维、提升存储性能的中型企业参考。

weixin_29200485的博客 325

关于DLL解释得比较好的文章

最近忙于开发苏州社保接口,遇到了很多棘手的问题,最主要的就是无法加载DLL,使得开发似乎一下子陷入了僵局。这两天在网上不断地查资料,总算有些眉目了,也恶补了薄弱的基础知识,下面的文章我觉得对于初学者比较适用,原文如下: 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!   初窥门径:Window...

weixin_30709635的博客 1622

[语义分割]SPP、空洞卷积与ASPP总结

ASPP全称:Atrous Spatial Pyramid Pooling,中文可以理解为空洞空间卷积池化金字塔或者多孔空间金字塔池化。在这其中,要理解两个概念:一个是SPP,池化金字塔结构或者叫空间金字塔池化层,都是一个东西;另一个是Atrous,空洞卷积,两个加在一起就是ASPP。 首先说一下SPP:Spatial Pyramid Pooling。这个结构出自于论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Re

lipengfei0427的博客 2万+

第一个DLL程序

一、DLL的简单介绍 1.DLL定义 DLL(Dynamitic Link Library)文件为动态链接库文件,又称“应用程序扩展”,是软文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同...

darcy_123的博客 703

Ollama本地大模型-个性化AI:训练自己的风格模型和数据投喂打造专属智能体验

之前我们使用Ollama下载了deepseek模型,现在我想将其训练成自己风格的模型,应该怎么做?

瑶山的博客 1782

基于simulink的BMS系统中电池单体故障隔离与恢复建模

本文介绍了使用Simulink构建BMS电池单体故障诊断与容错控制模型的方法。主要内容包括:1)搭建12串锂电池组模型;2)实现单体故障注入(过压、断线等);3)设计故障诊断与隔离模块(采用Stateflow状态机);4)开发恢复判断逻辑(需满足电压、温度等条件);5)系统监控与仿真设置。文章还提供了工程实践建议,如防环流设计、通信冗余等,并指出进阶方向(多故障处理、AI预警等)。该模型适用于新能源汽车、储能系统的BMS设计,可提高系统可靠性和安全性。

xiaoheshang_123的博客 140

第一个DLL程序:动态链接库DLL教程

DLL 程序的入口函数是 DllMain(),就像 DOS 程序的入口函数是 main()、Win32 程序的入口函数是 WinMain() 一样。前面我们一直在讲的就是DOS程序。 DllMain() 函数的原型为: BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID

BoomJane的专栏 857

机器翻译的评价标准:BLEU、ROUGE等指标说明及代码实现

机器翻译领域常用的自动评价指标主要包括BLEU、ROUGE、METEOR和COMET四大类。BLEU基于n-gram精确率和短句惩罚,ROUGE关注召回率,METEOR结合精确率和召回率并考虑同义词,COMET则利用预训练模型计算语义相似度。这些指标各有特点:BLEU适用于机器翻译,ROUGE对长句友好,METEOR更接近人工评分,COMET无需参考译文。代码实现上,sacrebleu、rouge-score等库提供了便捷的计算方式。新兴趋势包括基于BERT等模型的语义评估和大语言模型评估器,但传统指标仍占

数据知道的博客 9418

在VS2017环境下动手写你的第一个DLL

在VS2017环境下,开始写自己的第一个DLL(动态链接库),(本人小白,如果文章中有什么错误,还请各位指点)  首先介绍一下什么是动态链接库,我们平常在安装游戏,安装软件的时候,有的时候就会提示你,无法打开。。。由于缺失。。。.dll文件,请重新安装。这就是由于安装过程中丢失了某种dll文件产生的,在百度百科上是这么解释的       DLL(Dynamic Link Library)文件为动态...

Call_Coder的博客 1万+

微信小程序:errno: 600001, errMsg: “uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::E

微信小程序报错uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::ERR_CONNECTION_RESET, custum ip is invalid, didn't find user's ip,wx.uploadFile errno: 600001 errcode:-101 ?微信小程序wx.uploadFile错误,wx.uploadFile 在真机上报下面的错误,调试工具里没有问题,其它接口在真机/调试工具都正常,

✅ 精选推荐文章 4258

DaVinci配置DID之三:代码实现

本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。1,CDD准备2,工具链配置3,代码实现4,验证结果本文讲述流程3话不多说,走你~博主是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在下章关于测试验证的博文再相会哈~

weixin_48498880的博客 5360

Visual Studio 2010 中的DLL基础知识

对于DLL的链接,新手还是会有很大麻烦,这里把一些基础知识列出来,本文所有内容源于MSDN文档 从DLL中导出函数 DLL和一般可执行程序的区别:   主要是DLL只能在系统中运行一个实例并且它无法拥有一些一般程序有的事物,比如栈,全局内存,文件句柄和消息队列等等。同时DLL文件包含一个导出表(Exports table),这个导出表包含了dll导出给其他程序用的所有函数。它们是这个DLL的

SV的边界 4539

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

DLL专题之VC开发DLL和DLL编写说明

今天,我们就真正进入了DLL编程,当然了,今天是写第一个DLL,就写个简单的啦!呵呵首先建立一个DLL工程(Win32 DynamicLink(Dll))工程,选择一个空的工程,然后添加一个头文件和一个实现文件,分别是:Simple.h和Simple.cpp.具体代码和说明如下:Simple.h文件内容:#ifndef _SIMPLE_DLL_H_#define _SIMPLE_DLL

章志强 2614

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC下dll程序的调试

VC下DLL程序的调试  很多初学DLL和COM编程的人都为DLL的调试方法发愁。我结合自己学习COM的体验,总结DLL程序的调试如下。  DLL是一个不可运行的程序,它必须有其它程序的加载才可运行。故要调试DLL程序,需要一个测试程序。根据测试程序的不同,我将DLL调试分三种请况。1.测试程序有源码。2.测试程序无源码,只有可执行(exe)文件。3.对DLLRegisterS

henrylzh的专栏 1407

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

DLL程序的创建和调用方法

DLL(动态链接库),是一种可以被其他应用程序调用的程序模块,其中封装了可以调用的资源或函数,一个DLL文件可以被多个进程调用。动态链接库是在exe文件运行的时候被加载执行的,动态链接库可以减少可执行文件的体积,在需要的时候进入内存,将软件划分为多个模块,可以按照模块进行开发,当然在网络安全方面可以进行对某个特定进程的DLL注入。 DLL程序的入口函数不是main()或者WinMain()函数,...

wxf明的博客 1219
上一篇: DllMain——DLL程序入口点函数
下一篇: 变量命名规范
Quellaaa
博客等级 码龄9年 24粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值