什么是动态链接库
为什么会出现动态链接库
有过编程经验的朋友应该清楚,将所有模块的源代码都静态编译到整个应用程序的可执行文件中,会产生两个主要的问题:
为解决以上静态编译的两个问题,动态调用技术就出现了。
动态链接库与静态链接库的区别
1、静态链接库的优点
(1) 代码加载速度快,执行速度略比动态链接库快;
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时,不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。
2、动态链接库的优点
(1) 更加节省内存并减少页面交换;
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
3、不足之处
(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用“载入时“动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用”运行时“动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。
Visual C++动态链接库创建
1、打开Microsoft Visual Studio 2010,选择文件->新建->项目。
2、在新建项目窗口中选择其他语言->Visual C++->Win32 项目,设置名称:TestDLL,设置解决方案名:TestDLL。
3、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。
4、在应用程序设置中,选择应用程序类型下的DLL,勾选附加选项下的”空项目“。
5、单击完成创建项目
6、向动态链接库添加类:
- 添加新类头文件。右键单击TestDLL项目,添加->新建项,选择头文件(.h),设置名称为TestDLL,单击添加。
- 添加新类源文件。右键单击TestDLL项目,添加->新建项,选择C++ 文件(.cpp),设置名称为TestDLL,单击添加。
7、为新类添加以下内容:
头文件TestDLL.h:
#pragma once;
//该宏完成在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
//宏DLL_IMPLEMENT在TestDLL.cpp中定义
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
extern "C" DLL_API int add(int x, int y); //简单方法
源文件TestDLL.cpp:
//注意此处的宏定义需要写在#include "TestDLL.h"之前
//以完成在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
#define DLL_IMPLEMENT
#include "SimpleDLL.h"
#include
#include
#include
#include
int DLL_API add(int x, int y)
{
return x + y;
}
LoadRunner调用动态链接库
1、打开loadrunner 的VuGen,选择协议”C Vuser“
2、保存脚本名称为”Testadd“
3、将已编译完成的动态链接库dll文件拷贝至Testadd脚本目录
4、添加以下代码:
Vuser_init 部分:
vuser_init()
{
int result;
result = lr_load_dll("SimpleDLL.dll");
if(result!=0){
return -1;
}
return 0;
}
Action部分:
Action()
{
int sum;
//调用动态链接库里的add函数
sum=add(6,7);
lr_output_message("this sum is :%d\n",sum);
return 0;
}
运行结果:
Starting iteration 1.
Starting action Action.
Action.c(6): this sum is :13
Ending action Action.
Ending iteration 1.