动态链接库函数的调用(在lr中使用dll)

本文介绍了如何在LoadRunner中调用C++编译的动态链接库(DLL)。首先,解释了静态库和动态库的区别,接着详细说明了在Visual C++中创建和隐形加载DLL的步骤,包括处理C++编译器的名字改编问题。最后,讨论了在LoadRunner测试脚本中如何添加和调用DLL,以及解决函数命名冲突的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1) 静态库与动态库

静态链接库是一个函数和数据都已经编译好的二进制文件。

动态链接库是指可执行程序运行时动态加载的运行库,动态链接库不但要提供lib文件,还必须提供核心的dll文件。动态库的lib文件只包含了导出的函数和变量的符号名,而dll文件则包含了实际的函数和数据。因此隐式加载动态链接库时需要提供lib文件,而显示加载动态链接库时只需要提供dll文件即可,而无须提供lib文件。

DLL适用用于基于c++语言开发的业务系统的性能测试,可以通过dll直接来测试一些方法的性能。调用开发人员包含加密与解码函数的dll来处理脚本中的数据等应用

2) 创建win32dll

win32dll.h

win32dll.cpp

使用depends工具查看dll,编译后函数名改编.c++支持函数重载,对于重载的多个函数而言重载后的名字都是一样的.为了加以区分,在编译链接时c++会按照自己的规则修改函数的名称.不同的C++编译器会采用不同的规则进行名字改编。因此,不同的C++编译器生成的程序在互相调用对方的函数时可能会发生问题。

 

3) visual c++隐形加载dll

第一步:将win32dll.libwin32dll.dll拷贝到win32dllapp的工程目录

第二步:projects--->setting--->link

第三步:在文件中导入dll中的函数声明

方法一:

extern int Add(int a, int b);

extern bool SetDate(char *p, int size);

方法二:

_declspec(dllimport) int Add(int a, int b);

_declspec(dllimport) bool SetDate(char *p, int size);

方法三:

#include "D:/win32dll/win32dll.h"

3)在visual C++中显示加载

第一步:调用LoadLibrary加载DLL,如果加载成功则会获取模块句柄

第二步:调用GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针

(由于应用程序是通过指针调用dll的函数,编译器不生成外部引用,故无须与导入库链接,即不需要对导入库win32dll.lib的引用)

第三步:对dll中的函数调用完成后,调用FreeLibray方法来释放对资源的引用

HMODULE LoadLibrary(LPCSTR lpFileName);

 

FARPROC GetProcAddress(HMODULE hModule,LPCSTR lpProcName);

 

BOOL FreeLibray(HMODULE hModule);

 

 

 

 

 

函数名称可以由dependency Walker获得,visual c++中显示加载dll时,应该以函数的导出名称作为GetProcAddress对应的参数。这样才可以正确获取地址

4)解决名字改编问题

(1)extern "C"

作用就是通知编译器按照c命名标准来进行编译,主要是为了使函数名称不发生改编,由此,LoadRunner的虚拟用户脚本才可以按照源程序中的函数名称进行调用

LoadRunner中调用win32dll.dll,通过add files to scriptdll文件添加到脚本中

2)模块定义文件

新建一个记事本文件,将其改变为deffiledll.def.在文件视图中右键添加Add Files to Project添加文件类型.def,然后选择deffiledll.def中。

(3) 函数调用约定

① C调用约定使用关键字_cdel

② 标准调用使用关键字_stdcall

③ visual c++默认的是c调用约定,所以省略了关键字_cdel

④ loadrunner使用dll时,对于c调用约定的函数可以采用extern"C"和模块定义的方式解决名称改编,对于标准调用约定的函数只能用模块定义文件的方式来导出函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值