浅析C/C++中动态链接库的创建和调用


DLL 有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。下面为你介绍C/C++中动态链接库的创建和调用。

动态连接库的创建步骤:

创建Dll有两种方式。

一、创建Non-MFC DLL动态链接库

1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo

2、新建一个。h文件DllDemo.h

#ifdef DllDemo_EXPORTS  
#define DllAPI __declspec(dllimport)  
#else  
#define DllAPI __declspec(dllexport) 
extern "C" //原样编译  
{ 
  DllAPI int __stdcall Max(int a,int b); //__stdcall使非C/C++语言内能够调用API  
} 
#endif

3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数 

#include "DllDemo.h"
DllAPI int __stdcall Max(int a,int b)  
{ 
   if(a==b)  
     return NULL;  
   else if(a>b)  
     return a;  
   else  
     return b;  
}

4、编译程序生成动态连接库

二、用.def文件创建动态连接库DllDemo.dll

1、删除DllDemo工程中的DllDemo.h文件。

2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。

3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:

1.LIBRARY MyDll 
2.EXPORTS 
3.Max@1

4、编译程序生成动态连接库。

动态链接的调用步骤:

一、隐式调用

1、建立DllCnslTest工程

2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录

3、在DllCnslTest.h中添加如下语句:

#define DllAPI __declspec(dllimport)  
#pragma comment(lib,"DllDemo.lib") //在编辑器link时,链接到DllDemo.lib文件  
extern "C"  
{  
DllAPI int __stdcall Max(int a,int b);  
}

4、在DllCnslTest.cpp文件中添加如下语句: #include "DllCnslTest.h"//或者 #include "DllDemo.h"

void main()  
{  
   int value;  
   value = Max(2,9);  
   printf("The Max value is %d\n",value);  
}

5、编译并生成应用程序DllCnslTest.exe

二、显式调用

1、建立DllWinTest工程。

2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。

3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。

4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。

例:

//需要引入头文件 windows.h最好在最前面,否则可能会出错  不需要windef.h 否则会报错 
#include <windows.h>
#include <iostream> 
typedef int(__stdcall *lpMax)(int a,int b); //此语句可以放在.h文件中 必须声明为__stdcall类型 否则出错

5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。

例:

HINSTANCE hDll; //声明一个Dll实例文件句柄  
hDll = LoadLibrary("DllDemo.dll");//导入DllDemo.dll动态连接库 

6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。

例:

lpMax M;  
M = (lpMax)GetProcAddress(hDLL,"Max");  
int value;  
value = M(2,9);  
std::cout<<value<<std::endl; 

注:上述代码中 Max = (lpMax)GetProcAddress(hDLL,"Max"); 其中参数”Max"为函数名称,可能无法找到(可能和未使用模块定义文件有关)。此时,可用两种方法解决

1、利用vs自带的命令行工具,查看函数的正确名称,首先cd 到bin目录(vc/bin),利用的是vs自带的dumpbin.exe工具。进入bin目录之后,输入命令dumpbin /exports d:\路径\xxx.dll,查看函数的输出名称。通常为_FunctionName@数字,此例中的名称为_Max@8.

2、根据函数在dll(生成dll的头文件中的顺序),例如 Max = (lpMax)GetProcAddress(hDLL,(LCPSTR)MAKEINTRESOURCE(1)); \\找到第一个函数

7、函数调用完毕后,使用FreeLibrary()卸载DLL文件。

FreeLibrary(hDll); 

8、编译并生成应用程序DllWinTest.exe

注:显式链接应用程序编译时不需要使用相应的Lib文件。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。希望通过本文的分析,你会对此有了解。

以上这篇浅析C/C++中动态链接库的创建和调用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。



相关阅读:
c#调用arcgis地图rest服务示例详解(arcgis地图输出)
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
ThinkPHP连接数据库的方式汇总
php从数据库查询结果生成树形列表的方法
JS实现的颜色实时渐变效果完整实例
安卓(Android)实现选择时间功能
苹果Mac电脑怎么播放.wma和.wmv格式的文件?
基于iframe实现类似于ajax的页面无刷新
PHP中对缓冲区的控制实现代码
全面解析JavaScript的Backbone.js框架中的Router路由
iscroll.js的上拉下拉刷新时无法回弹的解决方法
java selenium Selenium IDE介绍及用法
dedecms函数分享之获取某一栏目所有子栏目
解析在MYSQL语法中使用trim函数删除两侧字符
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 中国最美女教师 深山带学生 供暖公司试水通知 钱的思索作文1200字 蓝色的海豚岛读后感 平凡的世界读书笔记650字 快乐的平安夜晚会 我读初一作文350字 祖国,我想对您说——国庆60周年作文作文700字 大学双十一策划书 江水之间,且住流年 初恋如烟,浅笑而安。 初中本人自我鉴定 一点一滴年人生作文 含羞草为什么害羞 初一下学期班主任工作计划 2013年我的祖国母亲作文:祖国母亲 《向沙漠进军》第一课时教案 周国平:有所畏惧 离骚(节选)教学反思 旅游业发展小结汇报材料 甜蜜的毒药 鸟园记 励志作文:久违的感动 童趣与正义——《朝花夕拾》读后感800字 三尺亭台,两人对白 艺术管理系暑假实习报告 养花高手作文600字 爱情文章:人生若只如初见,却道故人心不变 档案局副局长“三严三实”专题组织生活会个人对照检查材料 经典语录 错过则是永远的遗憾 关于老虎的谚语大全 小学四年级作文550字:军训五味 无岸千年,别酒誓言 赶走惰性,抗住折腾 六一儿童节发言稿:欢庆六一 2015“儿童节”家长代表发言稿(简短篇) 白露时节 滋阴润肺食疗 公安领导工作述职述廉 后会无期经典台词 小学六年级作文550字:孤,独 万千思绪 入冬三梦 保护地球建议书作文500字 过往曾经,终已成云烟(写这个日志,算是对自己初中恋爱的总结吧) 小学六年级作文300字:成长的滋味 苍山易老。爱却永恒 班主任研修班培训心得体会 三提升活动实施方案 读莫言《檀香刑》受到震撼 2010年三八妇女节征文诗歌

Copyright © 2016 phpStudy |