悟透LoadRunner - 调用外部DLL的点点滴滴
引言
当我们使用VuGen时, 允许我们调用外部的DLL定义的函数。通过调用外部DLL中的函数,可以减少我们的脚本在整个运行期间内存消耗。同时,还有一个好处是可以对一些复杂的算 法进行复用,比如一个包括MD5加密、CRC32验证、文件压缩/解压、Base64编码的DLL将是多么振奋人心啊。
调用外部DLL的方法有两种:
- (单个脚本中)在脚本中是使用 lr_load_dll 函数。
- (全局设置,所有脚本)通过修改 mdrv.dat 文件实现。
对DLL的要求
VuGen只能识别标准C编译的DLL, 所以使用VC6创建的函数必须在函数开头加上extern "C",它告诉编译器对这个函数按照标准C的方式进行编译。而如果你想调用C#编译出来DLL,那就只能望而却步啦。如何想查看DLL中是否有符合要求的导出函数,可以使用微软的SDK里自带的Dependency Walker工具。如图:
DLL的创建
启动VC6,新建一个Win32 Dynamic-Link Library的工程,取名:LRDllTest
在这里,我们创建一个简单的求和函数Sum,并什么为导出函数,关键代码如下:
extern "C" LRDLLTEST_API int Sum(int a , int b);
//a + b
LRDLLTEST_API int Sum(int a , int b)
{
return a + b;
}
编译,生成DLL:LRDllTest.dll
lr_load_dll方法
有了符合要求的DLL,调用lr_load_dll函数显得非常的简单。lr_load_dll的函数原型是:
lr_load_dll(library_name);
所以,只需要调用该函数,传入需要引用的DLL路径,如果DLL放在脚本目录里,可直接写相对路径。这里,我推荐把该函数放在vuser_init这个Action里,一方面是由于vuser_init只会执行一次,如果我们放在中间的那个默认的Action中的话,DLL可能会被装载多次,这是没有必要的。另一方面,装载DLL也需要一定的性能开销,所以作为初始环境设置将它放在vuser_init中更加合理。
调用lr_load_dll装载DLL后,就可以任意使用该DLL中的导出函数,而不需要再去做任何声明了。嗯,用起来的确很简单,VuGen中代码如下:
{
lr_load_dll("LRDllTest.dll");
return 0;
}
Action()
{
int a = Sum(1,2);
lr_output_message("a = %d",a);
return 0;
}
Load Generators调用远程机器进行加压时调用lr_load_dll的方法
有人会遇到这种情况,使用lr_load_dll加载DLL的脚本在本机是可以顺利执行的,但是在Controller中通过负载生成器(Load Generators)调用远程机器执行脚本时,脚本会无法顺利执行,错误信息:
Error: CCI security error:You are running under secure mode and the function ci_load_dll is not allowed in this mode.
错误信息让人百思不得其解,不过能够猜到,肯定是远程机器无法调用加载的DLL所致。
众里寻他千百度,暮然回首,解决办法其实是如此的简单:
菜单“File-Add file to script”,把要引用的DLL加进来,一切搞定! 注意,Agent的Enable Firewall Agent选项不要勾上。
mdrv.dat方法
这个办法比较毒,通过修改mdrv.dat文件,无需调用lr_load_dll即可使用该DLL任何导出函数。具体实施方法如下:
- 将LRDllTest.dll拷贝到LoadRunner安装路径的Bin目录下。
- 修改mdrv.dat文件(安装路径的dat目录下),因为选择的是默认的Web协议,所以找到[lrun_api]节点,在后面加上一句:
WINNT_DLLS=LRDllTest.dll
OK,再试试不使用lr_load_dll函数,直接调用LRDllTest.dll中的Sum函数吧!
了解详细的内容请参考LR的帮助:HP LoadRunner Virtual User Generator User's Guide > Appendixes >Calling External Functions > Loading a DLL—Globally
转载于:https://www.cnblogs.com/coderzh/archive/2008/04/02/1135118.html
悟透LoadRunner - 调用外部DLL的点点滴滴相关推荐
- Python:使用ctypes库调用外部DLL 数据类型对应
Python:使用ctypes库调用外部DLL(转) 前言
- Python:使用ctypes库调用外部DLL
Python:使用ctypes库调用外部DLL 前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接.看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆 ...
- c#调用外部dll详解
一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要的组成要素之一, ...
- GameMakerStudio2调用外部dll库
项目上遇到的问题,记录下来 windows平台下GMS2调用外部动态链接库(DLL) 1.制作DLL文件(自行根据功能制作:C#制作DLL) 制作Dll需注意几点: 创建项目工程时需选择类库 由于要将 ...
- 在Delphi中调用外部DLL 之External DLL 导入DLL
调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1;interfaceu ...
- qt调用c语言编写的dll文件,Qt之调用外部DLL - moki_oschina的个人空间 - OSCHINA - 中文开源技术交流社区...
预备知识: 1.如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用. 2.通常Windows ...
- 调用外部 DLL 中的函数(显示调用)
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Di ...
- Unity发布UWP,Hololens调用外部dll识别二维码,获得中文拼音简码
识别二维码用的是zxing,下载ZXing.Net.0.16.0.0 打开Unity文件夹,把zxing.unity.dll放在Plugins文件夹下,Plugins文件夹下新建WSAPlayer,把 ...
- 悟透LoadRunner - 什么是性能测试?
引言 项目经理甲:"我们的系统功能非常强大,能够满足您所有的业务需求." 客户乙(使用后--):"果然不错!合作愉快!" --(一个星期后) ...
- VS 调用外部DLL时提示“无法嵌入互操作类型”
右击引用的类库,属性 --双击嵌入互操作类型(改为false)即可
最新文章
- 热议!“建议放学时间与父母下班时间一致”,网友:陪我一起996吗?
- 处理字符串_4_计算某个字符出现的次数
- 有关Linux下request.getRealPath(/)获取路径的问题
- [leetcode]27.移除元素
- camel 数据库_使用Camel在来自不同来源的Solr中索引数据
- tornado学习笔记day05-访问数据库
- java代码测试---插入排序和选择排序
- 黑客攻防技术宝典Web实战篇第2版—第8章 攻击访问控制
- python中用于输出内容到终端的函数是_python执行linux shell管道输出内容
- 用计算机绘制v-t图像,2.用计算机绘制v-t图象. [预习导引]
- Python邮件操作实例:发个邮件用Python实现远程自动关机
- low latency playback、deep buffer playback、compressed offload playback的区别
- Dex Loader] Failed to load D:\adt-bundle-windows-x86_64-20190307\sdk\build-tools\28.0.3\lib\dx.jar
- java实现网站统计功能_网站访问量统计功能的实现
- CLion - 卸载
- CDateTimeCtrl 用法总结
- Matlab将连续图片处理为视频
- HOOK 几种实现方式区别
- 问题 J: 老肖数等式
- java读Excel转List对象