Windows动态库学习心得
2015-05-02 11:46
155 查看
最近在工作中需要给项目组其他成员提供调用函数,决心抛弃以前“拷贝头文件/源文件”的简陋方法,采用动态库的方式对自己开发的接口进行模块化管理。因之前一直没有机会从事Windows动态库的开发,现借助这个开发任务,恶补了《程序员的自我修养》这本书,并通过动手实践+上网找资料的方式,学习了Windows DLL的工作原理、常见用法。本篇分为4个部分:DLL实例演示;DLL显示运行时链接;符号导入导出表;DLL优化。
1、DLL实例演示
(a)创建一个简单的DLL
编写代码
View Code
编译,执行
3、符号导入导出表
1、打开Microsoft Visual C++6.0 Tools——>Depends,将生成的Math.dll拖入其中,便可以查看动态库导出的函数
2、使用dumpbin,根据参数/EXPORTS,显示导出函数表
3、使用dumpbin,根据参数/IMPORTS,显示导入函数表
4、DLL优化
导入函数绑定——如果程序运行时,其依赖的DLL都以同样的顺序装载到同样的内存地址,那么他们的导出符号的地址是不变的。因此可以考虑将这些导出函数的地址保存至执行程序的导入表中,这样程序每次启动时都可以省去符号解析的过程。
使用工具editbin对TestMath.exea进行绑定:
查看绑定后TestMath.exe的导入表:
1、DLL实例演示
(a)创建一个简单的DLL
编写代码
#include <windows.h> #include <stdio.h> /* * Description: 申明一个函数指针,要求其输入两个double数据,返回一个double */ typedef double (*Func)(double,double); void main() { Func function; double result; //加载动态库 HINSTANCE hinstLib = LoadLibrary("Math.dll"); if (hinstLib == NULL) { printf("错误:不能加载动态库\n"); return; } //获取动态库中函数地址 function = (Func)GetProcAddress(hinstLib,"Add"); if (function == NULL) { printf("错误:不能找到Add函数\n"); //出错调用,需释放动态库 FreeLibrary(hinstLib); return; } //执行动态库函数 result = function(1.0,2.0); //出错调用,需释放动态库 FreeLibrary(hinstLib); //显示结果 printf("Result=%f\n",result); }
View Code
编译,执行
3、符号导入导出表
1、打开Microsoft Visual C++6.0 Tools——>Depends,将生成的Math.dll拖入其中,便可以查看动态库导出的函数
2、使用dumpbin,根据参数/EXPORTS,显示导出函数表
3、使用dumpbin,根据参数/IMPORTS,显示导入函数表
4、DLL优化
导入函数绑定——如果程序运行时,其依赖的DLL都以同样的顺序装载到同样的内存地址,那么他们的导出符号的地址是不变的。因此可以考虑将这些导出函数的地址保存至执行程序的导入表中,这样程序每次启动时都可以省去符号解析的过程。
使用工具editbin对TestMath.exea进行绑定:
查看绑定后TestMath.exe的导入表:
相关文章推荐
- Windows系统内核模态和用户模态一点学习心得
- 动态库控件编程学习心得
- Windows 类书的学习心得
- windows类书的学习心得
- Windows学习心得【模拟时钟】
- redis学习心得 -- windows 下安装 redis
- WINDOWS核心编程学习心得--线程调度
- Windows学习心得【非模态对话框】
- Windows学习心得【静态类】
- Windows注册文件类型信息的学习心得
- Windows学习心得【对话框2】
- Windows学习心得【鼠标测试中增加键盘接口】
- windows 服务程序学习心得
- Windows学习心得【计时器2】
- Windows学习心得【数字时钟】
- Windows学习心得【按钮类】
- Network Programming for Microsoft Windows 2nd(Windows 网络编程第二版) 学习心得
- 我的windows学习心得
- Objective C 学习心得 (一):--Windows下搭建objective C开发环境
- Objective C 学习心得 (一):--Windows下搭建objective C开发环境