LoadRunner如何实现动态链接库(C++)的调用

2017年12月16日20:53:43
  • LoadRunner如何实现动态链接库(C++)的调用已关闭评论
  • 414 views
  • A+
所属分类:LoadRunner

什么是动态链接库

  • 动态链接库的英文为DLL,它是Dynamic Link Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件,它提供了一种方法,使进程可以调用不属于其可执行代码的函数,只需该函数的可执行代码位于一个 DLL 中。一个DLL可以包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数,它还有助于共享数据和资源,允许多个应用程序同时访问内存中单个 DLL 副本的内容。
  • 动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。同时,DLL还为不同语言间代码共享提供了一条方便的途径,因此DLL在编程时应用较为广泛。

为什么会出现动态链接库

有过编程经验的朋友应该清楚,将所有模块的源代码都静态编译到整个应用程序的可执行文件中,会产生两个主要的问题:

  1. 有一些模块暂时不会被使用到,但也必须存在于进程的执行空间里;也有一些模块的功能可能较为通用,在构造其它软件系统时仍会被使用,但在各自的进程空间内必须出现多个相同的副本以满足每个进程的需要。前者增加了应用程序的大小,占用更多的磁盘空间,程序运行时也会消耗更大的内存空间,后者造成系统资源的浪费。
  2. 在编写功能复杂的可执行程序时,每次修改重建时都必须编译所有源代码,然后再发布给用户,增加了编译和发布过程的复杂性。

为解决以上静态编译的两个问题,动态调用技术就出现了。

  • 动态链接库(共享对象)只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,位于堆与栈之间的空间,当多个程序使用同一个函数库时,动态调用技术可以减少在磁盘和物理内存中加载的代码的重复量。
  • 当动态链接库(共享对象)中的函数需要更新或修复时,部署和安装动态链接库(共享对象)不要求重新建立程序与该动态链接库(共享对象)的链接。此外,如果多个程序使用同一个动态链接库(共享对象),那么多个程序都将从该更新或修复中获益。

动态链接库与静态链接库的区别

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,选择文件->新建->项目。

LoadRunner如何实现动态链接库(C++)的调用

2、在新建项目窗口中选择其他语言->Visual C++->Win32 项目,设置名称:TestDLL,设置解决方案名:TestDLL。

LoadRunner如何实现动态链接库(C++)的调用

3、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。

LoadRunner如何实现动态链接库(C++)的调用

4、在应用程序设置中,选择应用程序类型下的DLL,勾选附加选项下的”空项目“。

LoadRunner如何实现动态链接库(C++)的调用

5、单击完成创建项目 
6、向动态链接库添加类: 
- 添加新类头文件。右键单击TestDLL项目,添加->新建项,选择头文件(.h),设置名称为TestDLL,单击添加。 
LoadRunner如何实现动态链接库(C++)的调用 
LoadRunner如何实现动态链接库(C++)的调用
- 添加新类源文件。右键单击TestDLL项目,添加->新建项,选择C++ 文件(.cpp),设置名称为TestDLL,单击添加。 
LoadRunner如何实现动态链接库(C++)的调用 
LoadRunner如何实现动态链接库(C++)的调用

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 <Windows.h>  
#include <intrin.h>  
#include <stdlib.h>  
#include <string.h>  

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.
avatar