VC下的DLL学习心得!

来源:互联网 发布:网络竞速游戏排行榜 编辑:程序博客网 时间:2024/04/28 20:58
 

DLL文件在windows下,经常见到这种文件,以前不懂得时候曾经想试图打开过,每次双击就让选择用哪种工具打开,并且提示试图修改此文件或许会破坏程序或系统等,也就没敢强行打开,呵呵!

DLL文件全称应该叫 动态链接库!我理解就是很平实的库文件一样,就是提供函数的,不过这个比那些高级,比如stdio.h这个库,如果两个程序用到,它就会在每个程序下分别拷贝一份,这属于静态链接。而DLL就高级了,他是程序在动态时链接,也就是说程序刚开始不拷贝其中代码,只有用到得时候才进入DLL文件来查找相应函数,而且DLL更有利于模块化等等吧,反正是一个好东东。

VC6.0环境下,新建一个基于win32DLL工程。

_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文件工具,dumpbinDOS下运行,可以再VC安装目录下,VCBIN目录找到这个工具。

Dumpbin -exports name.dll就是这个样子啦!

简单的DLL文件就是这样,一切最基本的掌握了,在此基础上再增加就很容易了。等日后用到时,慢慢就会很精进了。

原创粉丝点击