本文主要介绍简单DLL的编写方法及在LoadRunner中局部调用与全局调用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.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

#i nclude"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;

}
 

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

2.LoadRunner调用动态链接库

完成动态链接库开发后,下面介绍动态链接库如何被LoadRunner调用。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

全局的动态链接库调用则需修改mdrv.dat,路径在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中随意的调用程序员写的API函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率。

LoadRunner 调用dll方法的更多相关文章

  1. LoadRunner调用md5方法

    LoadRunner调用md5方法 上一篇 / 下一篇  2011-04-29 11:25:12 / 个人分类:Loadrunner 查看( 958 ) / 评论( 0 ) / 评分( 0 / 0 ) ...

  2. LoadRunner 调用Dll完成加密解密

    LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...

  3. QT 调用 DLL 方法(三种方法)

    Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL.为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函 数) ...

  4. [转]如何在Java中调用DLL方法

    转载地址:http://developer.51cto.com/art/200906/129773.htm Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台 ...

  5. python调用dll方法

    在python中调用dll文件中的接口比较简单,实例代码如下: 如我们有一个test.dll文件,内部定义如下: extern "C"{ int __stdcall test( v ...

  6. QT创建与调用Dll方法(包括类成员)--显式调用

    看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说: 使用Qt编写模块化插件式应用程序 Qt 一步一步实现dll调用(附源码)---(这一篇里没 ...

  7. C++调用DLL方法

    调用的原理: 调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法:隐式 ...

  8. Visual Studio编译与调用DLL方法

    参考自博客:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html 用visual studio 2013新建win32 appli ...

  9. C# 通过反射类动态调用DLL方法

    网上看了很多关于反射的思路和方法,发现这个还算不错 //使用反射方: using System; using System.Collections.Generic; using System.Linq ...

随机推荐

  1. php分页函数示例代码

    分享一例php分页函数代码,用此函数实现分页代码很不错. 代码,php分页函数. <?php /* * Created on 2011-07-28 * Author : LKK , http:/ ...

  2. ny36 最长公共子序列

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  3. Xcode模拟器的一些快捷键

    Cmd+1/2/3       可以切换模拟器的显示比例. Option+Shift     可以在模拟器中调出双指拖动效果. Option      可以在模拟器中调出双指放大缩小效果. Comma ...

  4. Oracle PLSQL Demo - 16.弱类型REF游标[没有指定查询类型,已指定返回类型]

    declare Type ref_cur_variable IS REF cursor; cur_variable ref_cur_variable; rec_emp scott.emp%RowTyp ...

  5. eclipse手动build整个project

    eclipse默认是自动build你所编辑的java文件,但是这种自动build的前提是你对该java文件做了修改,因此,有的时候,如果你的class文件因为某种原因丢失了,你又不去手动build,e ...

  6. linux环境变量设置 以及 source命令 Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程 Linux 设置环境变量

    定制环境变量  环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell.对于Linux来说一般是bash,但也可以重新设定或切换到其它的Shell.环境变量文件:/etc/profil ...

  7. 一款基于jquery带百分比的响应式进度加载条

    今天要给大家带来一款基于jquery带百分比的响应式进度加载条.这款加载条非常漂亮,而且带有进度的百度比,且在不同的百分比用的是不同的颜色.而且这款加载条采用了响应式设计,在不同的分辨率的显示器下完美 ...

  8. SpringBoot配置成Liunx服务

    spring boot 可以打包成可执行的脚本来启动,其原理是在打成包时,将shell脚本注入到jar包中 #参考:https://docs.spring.io/spring-boot/docs/1. ...

  9. VMWare虚拟机安装创建虚拟机的使用教程

    VMWare虚拟机安装创建虚拟机的使用教程   在配置虚拟机之前需要安装它,VMWare软件的安装过程比较简单,在安装在之前应该先看下说明文档.下面以VMWare Workstation6.5虚拟机 ...

  10. iOS边练边学--通讯录练习之Segue使用,控制器的数据传递

    一.什么是segue Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) 二.Segue的属性 每一个segue对象,都有三个属性 < ...