博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LoadRunner 调用dll方法
阅读量:5908 次
发布时间:2019-06-19

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

本文主要介绍简单DLL的编写方法及在中局部调用与全局方法。

1.的编写

在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library建立一个空的DLL工程。

DLL必须有一个入口点,这就象C语言MAIN函数一样。在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;}

 

参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH:进程被调用、DLL_THREAD_ATTACH:线程被调用、DLL_PROCESS_DETACH:进程被停止、DLL_THREAD_DETACH:线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。

 

我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过例子来说明使用导出函数关键字_declspec(dllexport)创建DLL文件:

该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:

//MyDLL.hextern "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#i nclude"MyDll.h"//这里用比较大小的函数代替了我要实现的函数int desinit(int a, int b){if(a>=b)return a;elsereturn b;}int desdone(int a, int b){if(a>=b)return b;elsereturn a;}

 

 

该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。

2.调用动态链接库

完成动态链接库开发后,下面介绍动态链接库如何被调用。LoadRunner中的DLL调用有局部调用与全局调用:

局部调用方法:首先把编译的DLL放在脚本路径下,如MyDll.dll,MyDll.lib.然后在Action中使用lr_load_dll("MYDll.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

 

全局的动态链接库调用则需修改,路径在LoadRunner的安装目录下面(LoadRunner/dat directory),在里面修改如下:

[WinSock]*** name=wp32126>***ExtPriorityType=protocol*** name=wp32127>***WINNT_EXT_LIBS=wsrun32.dll*** name=wp32128>***WIN95_EXT_LIBS=wsrun32.dll*** name=wp32129>***LINUX_EXT_LIBS=liblrs.so*** name=wp32130>***SOLARIS_EXT_LIBS=liblrs.so*** name=wp32131>***HPUX_EXT_LIBS=liblrs.sl*** name=wp32132>***AIX_EXT_LIBS=liblrs.so*** name=wp32133>***LibCfgFunc=winsock_exten_conf*** name=wp32134>***UtilityExt=lrun_api*** name=wp32135>***ExtMessageQueue=0*** name=wp32136>***ExtCmdLineOverwrite=-WinInet No*** name=wp18958>***ExtCmdLineConc=-UsingWinInet No*** name=wp32140>***WINNT_DLLS=user_dll1.dll,user_dll2.dll, ...//最后一行是加载你需要的DLL

这样你就可以在LR中随意的调用程序员写的函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率。

转载于:https://www.cnblogs.com/shengs/p/3790069.html

你可能感兴趣的文章
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC...
查看>>
html input文本只读
查看>>
Struts2访问request,session,application的四种方式
查看>>
借用PortAudio采集和播放音频,实现一个双路混音器(转)
查看>>
eclipse 自动为getter和setter添加注释
查看>>
用链表实现的栈和队列
查看>>
oracle--数据库
查看>>
5、KVM虚拟机热迁移实现
查看>>
驰骋工作流引擎设计系列12 工作质量考核设计
查看>>
模拟服务器MockServer之Moco详细介绍
查看>>
UML
查看>>
图像库stb_image
查看>>
JAVA环境变量设置-windows--Linux
查看>>
一个命令让Ubuntu升级变得更简单
查看>>
提高Web开发速度技巧
查看>>
Pods
查看>>
Android动画之Property属性动画--高级用法
查看>>
016.科普.正则表达式及文本编辑
查看>>
第七节 泛型(Generics)
查看>>
struts2 下載 解決IE,火狐下載亂碼
查看>>