LR自定义函数以及调用
2.2.自定义函数以及调用
2.2.1.虚拟用户编程,使用C# 语言DLL
- 在VS中建立DLL类库项目,编写函数时使用public声明;实现函数后编译生成DLL;
- 在LR中建立 .Net Vuser脚本工程,
- 1、手动增加dll的配置,将附加的DLL文件放入bin\references目录下,打开scripts.csproj文件,增加节点引入DLL;或者
- 2、使用vs2005打开(.Net3.5以下),vs自动给你增加这个dll的配置,注意用不匹配的VS打开项目时,不要对LR的工程文件进行单项升级,否则LR将不支持升级后的版本;
- 在Action中开始引用一下using 命名空间(DLL的命名空间名称);就可以在Actinon中调用命名空间下的函数方法了;在脚本中Add Files to Script加入Dll可以远程负载时调用,否则场景中若使用远程负载时,会提示错误。
2.2.2
LR调用VC++6.0动态链接库
引言: VuGen使用Web(HTTP/HTML)等协议编写脚本时,程序使用的为类C语言,这样的程序可以引用Win32 Dynamic-link Library动态链接库, 允许我们调用外部的DLL定义的函数。通过调用外部DLL中的函数,可以减少我们的脚本在整个运行期间内存消耗。同时,还有一个好处是可以对一些复杂的算 法进行复用,比如一个包括MD5加密、CRC32验证、文件压缩/解压、Base64编码的DLL。
VC6.0对DLL的支持:
1、DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供 应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。
2、导出函数的声明方式:
- 一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
- 另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:
- LIBRARY 库工程名称
- EXPORTS 导出函数名
- DLL的调用方式:
- 一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
- 另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
步骤1-建立DLL工程:
打开VC++ 6.0,新建一个工程,这里先择工程类型为“Win32 Dynamic-link Library”,起一个工程名称,并选择好存方位置,在选择类型时选择“A DLL that exports some symbols。
步骤2-编写导出函数:
- 建立的.cpp文件中写入函数;
- 在.h文件中加入导出函数声明【extern "C" _declspec(dllexport) int func(int x);】,因为我们的loadrunner 的VuGen是一个C语言的解释器与编译器,只支持纯的C语言,不支持C++ ,所以,我们要在前面加“extern "C"”将函数转义成纯的C语言.
- 编译通过后工程下Debug/Release文件夹下有dll和lib文件生成;
步骤3-调试DLL:
- 在同一个工作区下建立win32 console application应用程序,
- 将上一步生成的.dll和.lib文件复制到该工程文件夹下;
- 在.h文件中导入lib文件,导入函数;
- #pragma comment(lib,”MFC_dll.lib”) //告诉编译器DLL相对应的lib文件所在路径和文件名,[ ../]父目录,[./]当前目录;
- extern “C”_declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入
4. 在.cpp文件main函数中写入函数调用,编译执行;
步骤4-LR调用DLL:
调用外部DLL的方法有两种:
- (单个脚本中)在脚本中是使用 lr_load_dll 函数。
lr_load_dll方法
有了符合要求的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中代码如下:
vuser_init()
{
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方法
通过修改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
3. 如何想查看DLL中是否有符合要求的导出函数,可以使用微软的SDK里自带的Dependency Walker工具。如图:
LR自定义函数以及调用的更多相关文章
- LR常用函数以及调用自定义函数
2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...
- php学习笔记:自定义函数的调用
PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰. ...
- matlab 自定义函数及调用
这一篇博客主要学习了: 第一,自定义函数优点有很多,比如可重复利用:容易纠错,以后直接装入大工程里(更重要的是,实参是复制给形参的,在自定义函数中运行时形参独立显示,这一点和C不一样). 第二,通过h ...
- 自定义函数和调用函数 return返回值
1.Q: 为什么要有函数,函数是什么? A: 函数能提高应用的模块性,和代码的重复利用率 2. 函数分为两个阶段: 1.定义阶段 2.调用阶段 3.关于函数调用: 01.函数的内存地址加上()就是调用 ...
- 在JS中,一个自定义函数如何调用另一个自定义函数中的变量
function aa1511() { var chengshi="马鞍山"; var shengfen="安徽省"; return shengfen+&quo ...
- FastReport调用Delphi中的人民币大写转换自定义函数
FastReport调用Delphi中的人民币大写转换自定义函数 FastReport调用Delphi中的人民币大写转换自定义函数 function TJzpzEdit1.MoneyCn(mmje ...
- Mysql - 存储过程/自定义函数
在数据库操作中, 尤其是碰到一些复杂一些的系统, 不可避免的, 会用到函数/自定义函数, 或者存储过程. 实际项目中, 自定义函数和存储过程是越少越好, 因为这个东西多了, 也是一个非常难以维护的地方 ...
- Oracle自定义函数1
用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其中,value被称为参数.函数参数有3种类型. IN 参数类型:表示输入给函数的参数 ...
- Oracle自定义函数
核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...
随机推荐
- 公司系统的license授权
在我的电脑的myeclipse的whnaproject项目下.可直接编译生成license.xml中所需要的授权码. 引用了spring-license-0.02.jar. package com.w ...
- NLog学习
一.什么是NLog? NLog((http://www.nlog-project.org)是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码. NLog允许我 ...
- 关于Failed to install helloworld.apk on device 'emulator-5554!的一个解决办法
好不容易架好了android环境,把该安得都安好了,结果发现在安装过程中创建一个虚拟设备映象就占用了c盘34g的空间,我的系统盘差点瘫了,看来以后就只能先用这一个虚拟设备调试了, 接着说上边这个问题, ...
- JVM实用参数(七)CMS收集器
HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器 ...
- 04-c#入门(类型转换)
“无论是什么类型,所有的数据都是一系列的位,即一系列0和1.变量的含义是通过解释这些数据的方式来传达的.”——这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些: ...
- OpenGL学习笔记4——模型视图变换
以日月地为例的一个模型视图变换.绕了比较多的弯路,下面是几个注意点总结. 注意点: 1.GL函数对模型的操作是基于当前局部坐标系,即模型坐标系而非世界坐标系,二者只在第一次初始化完毕之后才重合: 2. ...
- 如何使用 aspnetpager
<%@ Register assembly="AspNetPager" namespace="Wuqi.Webdiyer" tagprefix=" ...
- hadoop namenpde机制
1:通过查看hadoop的临时目录,看到有fsimage和edit文件 2:fsimage时namenode的元数据内存镜像文件,edit文件时hadoop客户端的操作记录, edit_inproce ...
- NOIP模拟赛-护花
[题目描述] 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽 ...
- vc-complex-type.2.3: Element 'filter-mapping' cannot have character [children], because the type's content type is element-only.
报这种错一般是因为导入的项目或者黏贴的代码中有中文空格或者中文编码,只需将报错代码重写一遍即可.