DLL文件在windows下,经常见到这种文件,以前不懂得时候曾经想试图打开过,每次双击就让选择用哪种工具打开,并且提示试图修改此文件或许会破坏程序或系统等,也就没敢强行打开,呵呵!
DLL文件全称应该叫 动态链接库!我理解就是很平实的库文件一样,就是提供函数的,不过这个比那些高级,比如stdio.h这个库,如果两个程序用到,它就会在每个程序下分别拷贝一份,这属于静态链接。而DLL就高级了,他是程序在动态时链接,也就是说程序刚开始不拷贝其中代码,只有用到得时候才进入DLL文件来查找相应函数,而且DLL更有利于模块化等等吧,反正是一个好东东。
VC6.0环境下,新建一个基于win32的DLL工程。
_declspec(dllexport) int add(int a,int b)
{
return a+b;
}
_declspec(dllexport) int jian(int a,int b)
{
return a-b;
}
写下这两个简单的测试函数,就是加减。发现与平常函数是不是有些不同?多了_declspec(dllexport)这个奇怪的关键字,是类型修饰?还是?在CC++里有这个关键字吗?
这个其实并不是关键字,而是预编译指令,告诉编译器这两个函数是属于DLL的。
编译一下,在DEBUG个目录下会生成一个LIB 和DLL文件。
如此一个简单的DLL文件就写好了,DLL文件是不能单独运行的,并需由其它的程序调用它,如此我们新建一个MFC得对话框程序,随便弄个BUTTON按钮,编写它的单击事件,
_declspec(dllimport) int add(int a,int b);
_declspec(dllimport) int jianfa(int a,int b);
在这之前一定要在调用程序里写下这两句,这两句的意思其实和这个一样
extern int add(int a,int b);
extern int jianfa(int a,int b);
这下明白了吧,就是告诉编译器这两个函数是外部链接,是外部文件提供的,只是用_declspec(dllimport)是专门声明DLL函数的,可以让编译器生成更优化的代码。
然后就可以像普通函数一样调用了。
CString str;
str.Format("%d",add(5,3));
MessageBox(str);
运行一下,啊,还有错误,哦,对了,还没有告诉编译器是在哪个DLL文件里引用呢,先把刚刚生成的DLL文件和LIB文件拷贝到工程目录下,然后选择工程,设置,连接,然后再库文件模块栏 写上你的name.DLL文件,再运行下,OK啦!
以上是显示调用,我们也可以用隐式调用。
HINSTANCE hist;
Hist=LoadLbrary(name); 参数为DLL的名字。
Typedef int (*Add)*(int a,int b);
Add add =GetProcAddress(hinst,fname);.//第二个参数就是函数名字,返回一个函数指针
注:查看DLL文件工具,dumpbin在DOS下运行,可以再VC安装目录下,VC,BIN目录找到这个工具。
Dumpbin -exports name.dll就是这个样子啦!
简单的DLL文件就是这样,一切最基本的掌握了,在此基础上再增加就很容易了。等日后用到时,慢慢就会很精进了。