博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LR调用动态链接库DLL
阅读量:4683 次
发布时间:2019-06-09

本文共 3623 字,大约阅读时间需要 12 分钟。

什么是动态库?

  动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库。

     动态链接提供了一种方法 ,使进程可以调用不属于其可执行代码中的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。

  

动态链接与静态链接区别?

  我们都知道,我们在编程时会调外部库函数,因为程序的中许多代码都是可以复用的,调用外部函数就大大的简化了我们的工作量。代码编写完成后,需要编译才能运行,在编译的过程中,会把程序中调用的函数库加载到内存里。这就是静态链接方式。

     假如有一个函数库,A程序要使用它,然后把函数库的内容全部加载自己的程序中。B程序也要使用这个函数库,B程序也把函数库的内容也全都加载到自己的程序中;这样同样一个东西重复出现在多个程序中,就会造成是种内存的浪费。所以,我们把被多个程序调用的函数放在一个公其的地方,就这一份。谁需要谁调用。这就是动态链接方式。

  可使用Dependency Walker工具来查看dll,参见:

 

Loadrunner为什么要使用动态库?

  DLL最重要的一个特点就扩展应用程序的特性。 再强大的工具也有不是万能的,通过调用动态库的方法极大地增强loadrunner的功能。当你在用loadrunner对于某些需求的测试感鞭长莫及时,这也是一种思路或方式。

 

Loadrunner如何使用动态库?

  LR选择http协议时支持的DLL为严格的C语言的DLL,对于C++编写的DLL需要在头文件中增加编译语句:extern "C",下面分别就VC和VS上创建可供LR调用的DLL编写的基本步骤进行介绍。

 

1)VC中创建动态库

下面通过VC++ 6.0中文版来创建一个动态函数。

1.1  打开VC++ 6.0,新建一个工程,这里先择工程类型为“Win32 Dynamic-link Library”,起一个工程名称,并选择好存方位置。  

      

 

1.2  点击“确定”按钮,会询问你希望创建什么类型的DLL?我们选择第三项“一个可以导出某些符号的DLL工程(D)”。点击确定,系统会给我们创建两个文件MyDLL.h和MyDLL.cpp。

  

 

1.3  分别对两个文件进行编写代码,因为这里创建的为.CPP文件,即C++的文件,因此头文件中需要加:extern "C",如果此处新建的是.c文件,则头文件中不能加:extern "C",且同样可以供LR调用。

1  MyDLL.h2 3     extern "C" MYDLL_API int lr_demo(int,int);
1 MyDLL.cpp2 3 MYDLL_API int lr_demo(int x ,int y)4 {5     int sum;6     sum = x + y;7 8     return sum;9 }

 

1.4  选择“工具”菜单---组建[MyDLL.dll] 或直接按F7程序进行编译。 编译完成后,提示没有错误与警告,说明我们成功了!

------------------Configuration: MyDLL - Win32 Debug--------------------Compiling...MyDLL.cppLinking...   Creating library Debug/MyDLL.lib and object Debug/MyDLL.expMyDLL.dll - 0 error(s), 0 warning(s)

 

1.5  在loadrunnre中调用动态库,打开我们的loadrunner 的VuGen ,写入下面代码。

1 vuser_init() 2 { 3  4     int ret; 5  6     ret=lr_load_dll("C:\\Users\\Administrator\\Desktop\\loadrunner\\MyDLL\\Debug\\MyDLL.dll");   //调用我们本地的函数文件,因为单斜杠(\)会被C语言转义,所以要用两个斜杠(\\)来表示路径。 7  8     if(ret!=0) return -1; 9 10     return 0;11 }
1 Action() 2 { 3  4     int sum; 5  6     sum=lr_demo(1,2);   //lr_demo 与我们vc++中的函数名一致 7  8     lr_output_message("this sume is :%d\n",sum);  //输出运算结果 9 10     return 0;11 }

 

运行结果:   

Starting iteration 1.Starting action Action.Action.c(8): this sume is :3Ending action Action.Ending iteration 1.

  从上面的代码看出。我们的loadrunner中并没有对数据进行计算,真正计算的代码是调用DLL函数库的代码。这样就大大增强了loadrunner的能力,而这种方式也使我们测试结果更加准确。

 

2)VS中创建动态库

2.1  打开VS,我在这里装的是VS2010,新建一个Win32控制台应用程序项目test1。

 

2.2 选择应用程序类型为DLL并为空项目

 

2.3  创建完工程后,分别在头文件和源文件夹下新建一个.h头文件和一个.c源文件或.cpp源文件(默认)

 

2.4  对于C语言,分别编写如下代码:

test1.h:

1 typedef int abc;2 3 _declspec(dllexport) abc desinit(abc a, abc b);4 5 _declspec(dllexport) abc desdone(abc a, abc b);

test1.c:

1 abc desinit(abc a, int b) 2 { 3     if(a>=b) 4         return a; 5     else 6         return b; 7 } 8  9 10 abc desdone(abc a, abc b)11 {12     if(a>=b)13         return b;14     else15         return a;16 }

 

对于C++语言(CPP),分别编写如下代码:

test2.h:

1 extern "C" _declspec(dllexport) int desinit(int a, int b);2 3 extern "C" _declspec(dllexport) int desdone(int a, int b);

 

test2.cpp:

1 #include "test2.h" 2  3  4 int desinit(int a, int b) 5 { 6     if(a>=b) 7         return a; 8     else 9         return b;10 }11 12 13 int desdone(int a, int b)14 {15     if(a>=b)16         return b;17     else18         return a;19 }

 

2.5  点击生成后,在工程目录下的Debug目录下回生成DLL文件。

 

2.6  拷贝以上DLL文件到我们的LR的脚本目录下,或在脚本区域点右键选择Add Files to Script,弹出框选择DLL文件

编写加载DLL文件,调用DLL中函数的脚本并运行,如下:

 

 

  在VS中创建动态库DLL,除了以上方式外,还可以在新建项目时直接新建一个空项目,然后再分别创建头文件和源文件,点击工程名称右键点击属性,在如下对话框中配置类型和扩展名为DLL。然后进行生成已得到DLL文件。

 

这里选择MT时生成的dll依赖的库可能比默认的MD会少一些

     

 

 

DLL依赖:

可以通过depends.exe工具查看dll依赖哪些其他的dll库,如下所示,LIBEAY32.DLL为第三方编译的库(与系统自带的不是同一个):

      

 尽量使提供给LR调用的dll只依赖系统自带的dll库,比如:当需要依赖其他第三方库时(openssl、google buffer等...)将第三库编译成静态库使用。

   

 

转载于:https://www.cnblogs.com/yezhaohui/p/3228353.html

你可能感兴趣的文章
c#基础学习(0627)之类型转换、算数运算符++、--
查看>>
08:Vigenère密码
查看>>
2010 求后序遍历
查看>>
C++和C#之间的数据类型对应关系
查看>>
模型分离(选做)
查看>>
LeetCode 242. Valid Anagram
查看>>
观察者模式------《Head First 设计模式》
查看>>
JSP表单提交乱码
查看>>
如何适应现代雇佣关系
查看>>
【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树
查看>>
redis sentinel 读写分离
查看>>
团队项目(第五周)
查看>>
ElasticSearch6(三)-- Java API实现简单的增删改查
查看>>
选拔赛 I 点进来吧,这里有你想要的
查看>>
SQL 优化经验总结34条
查看>>
开源 视频会议 收藏
查看>>
核心J2EE模式 - 截取过滤器
查看>>
test1
查看>>
常见反函数、反函数导数(微分)公式
查看>>
【物理】概念的理解 —— 蒸馏、萃取
查看>>