VC下的DLL学习心得!
来源:互联网 发布:网络竞速游戏排行榜 编辑:程序博客网 时间:2024/04/28 20:58
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文件就是这样,一切最基本的掌握了,在此基础上再增加就很容易了。等日后用到时,慢慢就会很精进了。
- VC下的DLL学习心得!
- vc下DLL/lib的调用
- vc下DLL/lib的调用
- vc下DLL/lib的调用
- VC下dll程序的调试
- vc 下调用C#的dll步骤
- VC下dll程序的调试
- vc下DLL/lib的调用
- 关于vc下dll的相关知识
- vc下DLL/lib的调用
- vc下DLL/lib的调用
- vc 2010 下打包dll 的问题
- vc下dll调试
- vc 下做DLL
- vc下dll调试
- 关于VC++_MFC的学习心得
- DLL 学习心得
- BCB下使用的VC生成的DLL
- HOOK的初步学习(非全局钩子)!
- 各种hash函数
- 对J2SE中的序列化的一个感性的认识
- 设置Android程序全屏
- C++中的虚函数与函数重载
- VC下的DLL学习心得!
- 基于MongoDB的php应用开发
- perl module
- Android ListView Adapter
- J2SE5.0新特性之使用代理服务器
- 全局HOOK的实现学习!
- 关于VC中时间函数的讨论
- 驱动学习之windows认识!
- Android的Menu键监听