您的位置:首页 > 其它

Windows动态库学习心得

2015-05-02 11:46 155 查看
  最近在工作中需要给项目组其他成员提供调用函数,决心抛弃以前“拷贝头文件/源文件”的简陋方法,采用动态库的方式对自己开发的接口进行模块化管理。因之前一直没有机会从事Windows动态库的开发,现借助这个开发任务,恶补了《程序员的自我修养》这本书,并通过动手实践+上网找资料的方式,学习了Windows DLL的工作原理、常见用法。本篇分为4个部分:DLL实例演示;DLL显示运行时链接;符号导入导出表;DLL优化。

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的导入表:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: