已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用C+进行DLL编程入门一、 编写第一个入门级dll文件1. 新建一个dlltest的dll工程,加入一源文件dlltest.cpp,包含add和subtract两个函数如下:_declspec(dllexport) int add(int a,int b)return a+b;_declspec(dllexport) int subtract(int a,int b)return a-b;/-注意:在函数名前加上_declspec(dllexport),这样编译后在连接的时候才会生成dlltest.lib(引入库文件)和dlltest.exp(输出库文件),并且在命令提示符下用dumpbin命令可以看到导出了哪些函数。方法:在命令提示符下,转到dll文件所在目录下,输入dumpbin exports dlltest.dll,列出导出函数如下: 这里注意到函数名字已经被改成了?addYAHHHZ,这种现象叫做名字粉碎,是为了支持函数重载而做的。2. 编写一个基于对话框的MFC程序测试DLL,工程名为calldll,放置两个按纽add和subtract,响应按纽消息,调用这个DLL的add和subtract函数。先添加响应按钮消息的函数OnAdd和OnSubtract,然后在函数所在源文件中写完整函数体如下:/extern int add(int,int);/extern int subtract(int,int);_declspec(dllimport) int add(int,int);_declspec(dllimport) int subtract(int,int);void CCalldllDlg:OnAdd() / TODO: Add your control notification handler code hereCString str;str.Format(2+3=%d,add(2,3);MessageBox(str);void CCalldllDlg:OnSubtract() / TODO: Add your control notification handler code hereCString str;str.Format(3-2=%d,subtract(3,2);MessageBox(str);/-这里采用隐式链接的方式加载动态链接库:注意:要用关键字extern先声明这两个函数,表明这两个函数是在外部定义的(不过程序中将它注释掉了)。最好是用_declspec(dllimport)表明函数是从动态链接库的lib文件中引入的,这样效率更高。将文件dlltest.lib拷贝到此工程目录下,并在Project Settings的Link标签下添加此文件:(否则编译会成功,但连接时会出错提示找不到函数的定义)编译连接生成calldll.exe,这时用Dumpbin -imports calldll.exe查看它的输入信息,可以看到它加载了dlltest.dll。运行calldll.exe(要成功运行还需将dlltest.dll拷贝到工程目录或此exe所在目录下)这样,最简单的第一个dll就完成了。二、 编写涉及到类和头文件的dll文件1. 新建一个dlltest的dll工程,加入一头文件dlltest.h和一源文件dlltest.cpp。dlltest.h:#ifdef DLL_API#else#define DLL_API _declspec(dllimport)#endifDLL_API int add(int,int);DLL_API int subtract(int,int);class DLL_API Point1 /将整个类导出public:void output(int x,int y);void output1(int x,int y);class Point2public:DLL_API void output(int x,int y); /仅导出类中的一个函数void output1(int x,int y);/-dlltest.cpp:#define DLL_API _declspec(dllexport)#include dlltest.h#include #include int add(int a,int b)return a+b;int subtract(int a,int b)return a-b;void Point1:output(int x,int y)HWND hwnd=GetForegroundWindow();HDC hdc=GetDC(hwnd);char buf50;memset(buf,0,50);sprintf(buf,x=%d,y=%d,x,y);TextOut(hdc,0,0,buf,strlen(buf);void Point1:output1(int x,int y)HWND hwnd=GetForegroundWindow();HDC hdc=GetDC(hwnd);char buf50;memset(buf,0,50);sprintf(buf,x=%d,y=%d,x,y);TextOut(hdc,0,0,buf,strlen(buf);void Point2:output(int x,int y)HWND hwnd=GetForegroundWindow();HDC hdc=GetDC(hwnd);char buf50;memset(buf,0,50);sprintf(buf,x=%d,y=%d,x,y);TextOut(hdc,0,20,buf,strlen(buf);void Point2:output1(int x,int y)HWND hwnd=GetForegroundWindow();HDC hdc=GetDC(hwnd);char buf50;memset(buf,0,50);sprintf(buf,x=%d,y=%d,x,y);TextOut(hdc,0,20,buf,strlen(buf);/-dlltest.h:#ifdef DLL_API#else#define DLL_API _declspec(dllimport)#endifDLL_API int add(int,int);DLL_API int subtract(int,int);class DLL_API Point1public:void output(int x,int y);void output1(int x,int y);class Point2public:DLL_API void output(int x,int y);void output1(int x,int y);2. 编写一个基于对话框的MFC程序测试DLL,此时在工程中包含上面这个头文件,不用在声明导入的类和函数了。三、 使用模块定义文件和动态加载动态链接库1. 新建dlltest.dll工程,加入一源文件dlltest.cpp,包含add和subtract两个函数如下:int add(int a,int b)return a+b;int subtract(int a,int b)return a-b;/-2. 使用模块定义文件防止文件名改变,在目录中新建dlltest.def文件,增加到工程。LIBRARY dlltestEXPORTSaddsubtract/-注:LIBRARY和EXPORTS的用法参照MSDN.3. 编译后用dumpbin查看到函数名没有改变。4. 用动态加载的方法来调用dll文件。void CCalldllDlg:OnAdd() / TODO: Add your control notification handler code hereHINSTANCE hInst;hInst=LoadLibrary(dlltest.dll);typedef int (/*_stdcall*/ *ADDPROC)(int a,int b);/ADDPROC Add=(ADDPROC)GetProcAddress(hInst,?addYAHHHZ);/ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1);ADDPROC Add=(ADDPROC)GetProcAddress(hInst,add);if(!Add)MessageBox(获取函数地址失败!);return;CString str;str.Format(2+3=%d,Add(2,3);MessageBox(str);FreeLibrary(hInst);注意:1. 这里调用的GetProcAddress函数中的第二个参数是动态链接库中导出的函数名,如果动态链接库中没有用模块定义文件防止函数名粉碎,则要用注释掉的GetProcAddress(hInst,?addYAHHHZ),另外也可按序号访问GetProcAddress(hInst,MAKEINTRESOURCE(1)。2. 使用模块定义文件后,如果改变调用约定为_stdcall,函数名也不会被改变,但如果加上_stdcall定义函数,调用时也需要加上_stdcall,否则会出错。3. 动态加载不需要将文件dlltest.lib拷贝到此工程目录下,并在Project Settings的Link标签下添加此文件,只需将dll文件拷贝到工程目录下即可,并且通过dumpbin -imports calldll.exe查看它的输入信息时,可以看到它并没有加载dlltest.dll。4. 动态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 相关法律知识模拟试卷及答案
- 农业机械化推广专员履职能力评估表
- 零售业商场店长绩效与管理能力评估表
- 确认参加下月行业交流会的回复函5篇范本
- 律师事务所律师执业水平与专业素养绩效评估表
- 关于申请参加行业研讨会的回复函(3篇)
- 施工图设计质量考核评定表
- 翻身护理预防褥疮课件
- 智慧城市数字治理体系
- 2026年妇产科护理学考试模拟试卷及答案(十五)
- 2027年高考地理复习:综合题 答题方向+答题模版汇编
- 2025年控告申诉检察业务竞赛真题及答案解析
- 非开挖顶管技术施工流程
- 业委会知识培训课件
- 外购件检验管理制度
- 福建日报新闻发展有限公司招聘考试真题2024
- 2024年奉贤区区属国有企业招聘考试真题
- 医院感染管理规章制度
- GB/T 20424-2025重有色金属精矿产品中有害元素的限量规范
- 2022年全国森林、草原、湿地调查监测技术规程-附录
- 2024年版药品区域独家代理授权协议版B版
评论
0/150
提交评论