用VC++封装自己的DLL动态链接库
初学vc就要自己封装动态库,我是用c写的程序代码,在网上找了半天,发现vc++深入详解(孙鑫)的书不错,对于第十九章中的动态链接库,讲的很详细,学习了很多。
我的动态链接库的制作,总结了一下,从小的简单的dll逐渐逐层放大,记录下来,以后方便查找。
1.Win32 DLL的创建和使用
首先利用vc++新建一个Win32Dynamic-Link Library 类的工程,工程取名为:Dll1,并在AppWizard的第一步选择“An empty Dll project”选项,即创建一个空的动态链接库工程。然后,为该工程添加一个c++源文件Dll1.cpp,向其中添加函数,分别为:加法运算和减法运算函数,代码为:
int add(int a,int b){return a+b;}int subtract(int a,int b){return a-b;}
点击bulid(CTRL+F7或者选中cpp文件右键编译)命令可生成动态链接库,名字为Dll1.dll文件。
生成DLL后,就可以导出函数,但是需要在每一个将要被导出的函数前面添加标识符_declspec(dllexport),所以修改上述代码如下:
_declspec(dllexport) int add(int a,int b){return a+b;}_declspec(dllexport) int subtract(int a,int b){return a-b;}
然后点击bulid命令,下面的窗口会输出如下信息:
——————Configuration:Dll1-Win32 Debug-------------——
Compiling...
Dll1.cpp
Linking ...
Creating library Debug/Dll1.lib and object Debug/dll1.exp
Dll1.dll -0 error(s),0 wrning(s)
可以看到,生成两个新文件,其中Dll1.lib 文件就是前面提到的引入库文件,该文件保存的是Dll1.dll中导出的函数和变量的符号名:Dll1.exp文件是一个输出库文件,在这里,该文件并不重要。
因为C++支持函数重载,对于从在的多个函数来说,其函数名都是一样的,为了加以区分,在编译连接时,c++会按照自己的规则篡改函数的名称,称为“名字改编”,
2。隐式链接方式加载DLL
编写一个测试程序测试这个动态库,新建一个.cpp文件取名为dlltest.cpp。
(1)利用extern声明外部函数
为了让编译器知道这两个函数,需要对函数做一个声明,即在函数名前面加上extern 表示函数是在外部定义的。如下:
extern int add(int a,int b);extern int subtract(int a,int b);int main(){printf("%d",add(5,3));printf("%d",subtract(6,4));}
点击bulid命令,会出现三个错误:
linking...error executing link.exe
可看出,编译成功,因为add和subtract函数做了声明,但在程序连接时出错,因为连接器没有找到该信息,
为了解决这个问题,需要利用动态链接库的引入库文件,将Dll1..lib 和dll文件复制到dlltest.cpp目录下,然后再dlltest.cpp程序中,选择【工程-设置-连接选项卡】在"附加依赖项"添加dll1.lib再次运行,就会成功。
(2)利用_declspc(dllimport)声明外部函数
如:
_declspec(dllimport) int add(int a,int b);_declspec(dllimport) int subtract(int a,int b);
与使用extern关键字这种方式相比,使用_declspec(dllimport)标识符声明外部函数时,他将告诉编译器该函数是从动态链接库中引入的,编译器可以生成运行效率更高的代码,因此,如果调用的函数来自于动态链接库,因该采用这种方式声明外部函数。
3。完善W32Dll例子
要想将生成的Dll提供给用户,通常在编写动态链接库时,都会提供一个头文件,在此头文件中提供Dll导出函数原型的声明,以及函数的有关注释文档。
为Dll1工程添加一个头文件:Dll1.h 添加代码如下:
_declspec (dllimport) int add(int a,int b);_declspec(dllimport) int subtract(int a,int b);
然后在测试文件中添加#include"路径/Dll1.h"
用VC++封装自己的DLL动态链接库相关推荐
- 我的Dll(动态链接库)学习笔记
DLL(Dynamic Link Libraries)专题: 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.可能存在一些模块的功能较为通用,在 ...
- 用VC开发串口通信dll控件
VC串口通信技术网<VC串口上位机编程方法简介>介绍了串口编程的常见方法,其中就有使用串口dll控件的方法,dll是一种动态链接库,使用起来非常方便. 本文利用VC编程工具,对Window ...
- 基于VC++6.0的DLL开发
原文地址:http://blog.163.com/twnhr@126/blog/static/78927547200910254346804/ 基于VC++6.0的DLL开发 最近在开发一个基于网络的 ...
- 我的Dll(动态链接库)学习笔记(转)
DLL(Dynamic Link Libraries)专题: 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.可能存在一些模块的功能较为通用,在 ...
- VB无所不能之五:建立“标准”DLL动态链接库文件(1)
VB无所不能之五:建立"标准"DLL动态链接库文件(1) --作者:钟声 博客地址:http://useway.blog.51cto.com 动态链接库经常被认为是VC或者Deph ...
- DLL动态链接库的工作原理
DLL动态链接库的工作原理 分类: VC++神奇理论2012-08-29 11:12 2635人阅读 评论(0) 收藏 举报 dll工作windowsexedelphimicrosoft " ...
- c 调用易语言dll字节集,总结VC与易语言DLL互相调用的方法
在编写程序的时候往往需要调用到别的语言编写的DLL文件,下面先来看一下在易语言中如何调用VC编写的DLL呢,首先用VC编写一个简单的DLL文件,代码如下: int WINAPI add(int x,i ...
- C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]
前言 当你认真的写完客户端和服务器端的时候可能不需要再继续往下看关于播放器的代码和说明,因为你已经掌握了如何转换VC++代码的技巧了,加上GOOGLE再来完成这个播放器应该算小菜了.但是作为我的系列, ...
- VS封装并调用dll文件
迟迟钟鼓初长夜,耿耿星河欲曙天 有任务问题欢迎私信提问 将代码封装成dll可以隐藏代码,当作黑盒使用 1.创建 dll 工程 确定->选择DLL->完成 导出符号: 如果勾选了导出符号,就 ...
- Win下基于通用C运行库UCRT的部署 - 及 {C++/CLI封装的托管dll被C#工程调用时出现未加载(could not load file or assembly)错误排查}
目录 C++/CLI封装的托管dll被C#工程调用时出现未加载(could not load file or assembly)错误排查及基于通用C运行库UCRT的部署 0 问题分析 1 用于排查的工 ...
最新文章
- springboot: Spring Data JpaRepository
- Scala基础教程(五):函数、闭包
- asterisk1.8启动信息分析(未完)
- 吉麦新能源与联想签订战略合作协议,共同拥抱智能网联汽车升维时代
- android怎么升级版本5.0,一加手机怎么升级安卓5.0系统
- 论__AlertDialog自定义布局回调修改的正确方式
- java手动分页工具类
- 数据中台 画像标签_如何通过数据中台标签平台,圈出产品高价值用户?
- iOS 13-Sign In with Apple
- 由一个DAOHelper类引发的思考
- html超链接为变量,如何向超链接添加变量值
- 2021-12-11 【数据结构平时实验】【图】
- 自制智能手机电话APP
- 区块链版权登记_利用区块链版权证书证明著作权
- PathInfo模式的支持
- nth_element(C++)
- DenseFuse :A Fusion Approach to Infrared and Visible Images解读
- Win10怎么设置窗口护眼色
- 小码农也有大梦想!javaweb编程技术微课版答案
- mockcpp 介绍与使用示例
热门文章
- Python 高层文件操作(shutil模块)(转载)
- 快速排序中pivot的选取策略
- mysql 多源复制 过滤_MYSQL 多源复制,过滤复制与应用场景
- ppt格式刷快捷键_15个PPT神操作,让老师做课件的效率翻倍!
- python文件系统监控_简单了解Python下用于监视文件系统的pyinotify包
- 关于Linux系统启动过程,你应该了解这些
- openresty连接mysql_在CentOS 6上使用openresty访问mysql
- 哪吒之魔童降世视听语言影评_《哪吒之魔童降世》影评:生而孤独,从不认命...
- grafana导入json文件没有数据_基于SpringBoot将Json数据导入到数据库
- 设置java heap_JAVA HEAP SPACE解决方法和JVM参数设置