您的位置:首页 > 其它

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

2011-04-27 12:19 323 查看
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.lib于win32dll.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 script把dll文件添加到脚本中

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

(3) 函数调用约定
① C调用约定使用关键字_cdel
② 标准调用使用关键字_stdcall
③ visual c++默认的是c调用约定,所以省略了关键字_cdel
④ 在loadrunner使用dll时,对于c调用约定的函数可以采用extern"C"和模块定义的方式解决名称改编,对于标准调用约定的函数只能用模块定义文件的方式来导出函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息