例程详析动态链接库
bull77
动态链接库(dll,即 dynamic-link library)是可执行的模块,但它没有自己的堆栈,必须在调用动态链接库函数的程序
环境下运行。动态链接库不仅可以作为一个运行模块,包括函数代码,而且可以包含程序以外的任何数据或资源(位图、图标
等等)。动态链接库就是给应用程序提供函数或者资源。
动态链接与静态链接是相对立的。静态链接的时候,可执行程序内包含了所访问的函数的代码,可执行程序占用的空间较
大;但运行时,不需要其他模块支持,从而速度相对较快。动态链接的可执行程序中不包含动态访问的函数代码,仅仅包含对
它的参考,运行时需要其他模块(dll)的支持,速度相对较慢。
动态链接库是windows的一种极其重要的技术。它使得开发人员可以通过编写动态链接库,方便灵活的实现大型程序的开
发,按自己的意愿对操作系统进行扩展。
下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、
类。
一、 函数的定义和使用方法:
第一步:
运行appwizard,定义项目名为mydll,选择mfc appwizard(dll),而不是mfc appwizards(exe)。
第二步:
在这个例子中,只有一个appwizard屏幕出现,选择mfc扩展dll(mfc extension dll (using shared mfc dll),点击
finish生成工程。
第三步:
点击file中的new,选择c/c++ header file,file name中输入dll,点击ok,创建dll.h。输入extern "c" __declspec(dllexport)
int fun(int x1,int x2,int x3); ,保存。
第四步:
点击file中的new,选择c++ source file,file name中输入dll,点击ok,创建dll.cpp。输入
#include "stdafx.h"
#include "dll.h"
extern "c" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
编译生成mydll.dll和mydll.lib。
第五步:
选择project 中add to project 中的new , 重新生成一个工程,选择mfc appwizards(exe),项目名为mydlltest , 选择single
document ,点击finish,生成一个新的工程。选择菜单中的project àset active project àmydlltest ,将mydlltest设为当前活动工程
。
第六步:
拷贝…\mydll\debug\mydll.dll 到 ..\mydlltest\debug\下,拷贝…\mydll\debug\mydll.lib到…\mydlltest\目录下。
第七步:
在mydlltestview.cpp中的#endif下添加
extern "c" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void cmydlltestview::ondraw(cdc* pdc)中添加代码如下:
void cmydlltestview::ondraw(cdc* pdc)
{
cmydlltestdoc* pdoc = getdocument();
assert_valid(pdoc);
// todo: add draw code for native data here
int x=fun(1,2,3);
cstring str;
str.format("%d",str);
pdc->textout(10,10,x);
}
第八步:
在workspace中的mydlltest files上点击右键,选择add files to project ,将mydll.dll添加到工程。
好了,我们的工作做完了,运行一下看看吧!
二、 类的添加和使用步骤:
在mydll中生成一个新类,类的声明处改为class afx_ext_class cmyclass ,在此类中和其他类一样添加自己需要的变量
和函数,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个myclass.h文件,拷贝mydll中
myclass.h的所有代码到新生成的myclass.h中。在需要使用dll中cmyclass类的文件中包含myclass.h,然后我们就可以向其他类
一样使用该类了。
三、 字符串的定义和使用
在mydll中定义字符串资源,编译生成新的dll和lib,重复上面的第六步,在mydlltest中的myclass.h中添加 #define ids_mystr
1(假设我们定义的字符串资源的id号为ids_mystr),在需要是要该字符串的地方添加#include "myclass.h",即可使用该字
符串了。
cstring str2;
str2.loadstring(ids_mystr);
四、 对话框的定义和使用
在mydll中定义对话框资源,生成一个新类cdlg,类的声明处改为class afx_ext_class cdlg : public cdialog ,像其他对
话框一样定义对话框的属性和功能,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个dlg.h文件
,拷贝mydll中dlg.h的所有代码到新生成的dlg.h中。在需要使用dll中此对话框资源的文件中包含dlg.h,然后我们就可以向其他
对话框一样使用此对话框了。
cdlg dlg;
dlg.domodal();
好了,到这里我们所有的功能就都实现了,快编译运行一下吧!