LoadRunner下DLL的调用
2005-07-27 20:02
302 查看
LoadRunner下DLL的调用
——落叶夏日cwj.007场景介绍
最近在做类似于QQ的通信工具的性能测试时发现了一些问题,现总结出来与大家分享一下。希望大家在使用LoadRunner时不仅仅停在只是录制/播放角本,而全面提升角本的编程技术,解决复杂场景。 本次测试中碰到的问题是这样的,在消息的传送过程中遇到了DEC加密的过程,LoadRunner录制到的全是加密的消息,比如我录制了某一个用户的登陆,发送消息,退出,但由于是加密的,只能单个用户使用,但如果我想并发多少个用户就存在很多问题,最直接的一个问题就是用户名是加密的,密码是加密的,当然你可以说让程序那里注掉加密的代码进行明码的测试,当然也是一种办法。但程序组提出了要使用更真实的方法来模拟,这时就必需使用下面介绍的方法。 一开始是直接把API移植到LoadRunner中来,不过由于加密算法异常复杂,有几层循环,而角本是解释执行的,进行一次加密运算可能需要好几分钟,当然在角本里可以把角本本身运行的时间去掉,但这样做显然没有直接调用DLL来的效率高。由于程序组比较忙,所以无法提供DLL给测试,所以测试完成了DLL的编写,并在LoadRunner中调用成功,高效的完成了用户信息加密,参数关联,成功的完成了测试。动态链接库的编写在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library建立一个空的DLL工程。
1. Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库
每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break;default: break; } return TRUE; } |
我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。
1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
//MyDLL.h extern "C" _declspec(dllexport) int desinit(int mode);extern "C" _declspec(dllexport) void desdone(void);extern "C" _declspec(dllexport) void des_setkey(char *subkey, char *key);extern "C" _declspec(dllexport) void endes(char *block, char *subkey);extern "C" _declspec(dllexport) void dedes(char *block, char *subkey); //MyDll.cpp #include"MyDll.h"//这里我用了比较大小的函数代替了我要实现的函数 int desinit(int a, int b) { if(a>=b)return a; else return b; } int desdone(int a, int b) { if(a>=b)return b; else return a; } |
LoadRunner调用动态链接库
上面完成动态链接库开发后,下面就介绍动态链接库如何被LoadRunner进行调用,其实也是很简单的。在LoadRunner中的DLL调用有局部调用与全局调用,下面介绍局部调用。首先把你编译的DLL放在角本路径下面,这里是MyDll.dll,MyDll.lib.然后在Action中使用lr_load_dll("MYDll.dll"),此函数可以把DLL加载进来,让你调用DLL里面的函数,而DLL中的运算是编译级的,所以效率极高,代码样例如下:#include "lrs.h"Action(){ // int nRet = 6; char srckey[129]; memset(srckey, 'a', 128); lr_message(lr_eval_string(srckey)); lr_load_dll("MyDLL.dll"); nRet = desinit(5,8); lr_message("比较的结果为%d",nRet); return 0;}运行结果 比较的结果为8全局的动态链接库的调用则需要修改mdrv.dat,路径在LoadRunner的安装目录下面(LoadRunner/dat directory);在里面修改如例:
[WinSock] ExtPriorityType=protocol WINNT_EXT_LIBS=wsrun32.dll WIN95_EXT_LIBS=wsrun32.dll LINUX_EXT_LIBS=liblrs.so SOLARIS_EXT_LIBS=liblrs.so HPUX_EXT_LIBS=liblrs.sl AIX_EXT_LIBS=liblrs.so LibCfgFunc=winsock_exten_conf UtilityExt=lrun_api ExtMessageQueue=0 ExtCmdLineOverwrite=-WinInet No ExtCmdLineConc=-UsingWinInet No WINNT_DLLS=user_dll1.dll, user_dll2.dll, ... //最后一行是加载你需要的DLL 这样你就可以在LR中随意的调用程序员写的API函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率。
相关文章推荐
- LoadRunner 调用Dll
- LoadRunner下DLL的调用
- LoadRunner 调用Dll完成加密解密
- LoadRunner 调用Dll完成加密解密
- LoadRunner 调用Dll完成加密解密
- LoadRunner调用外部DLL的方法
- (原创)LoadRunner 中 调用dll
- LoadRunner调用Dll
- LoadRunner测试过程中调用dll文件…
- loadrunner调用外部Dll
- LoadRunner 调用Dll完成加密解密
- LoadRunner 调用Dll完成加密解密
- LoadRunner下DLL的调用
- LoadRunner下DLL的调用
- LoadRunner中动态链接函数库(dll)的调用
- 转:LoadRunner下DLL的调用
- LoadRunner下DLL的调用
- LoadRunner中调用DLL的补充说明
- Loadrunner调用的DLL中的函数有类的实例时解决方法
- LoadRunner简单应用之:C++ DLL的实现及调用