动态链接库函数的调用(在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方法来释放对资源的引用
函数名称可以由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"和模块定义的方式解决名称改编,对于标准调用约定的函数只能用模块定义文件的方式来导出函数
静态链接库是一个函数和数据都已经编译好的二进制文件。
动态链接库是指可执行程序运行时动态加载的运行库,动态链接库不但要提供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"和模块定义的方式解决名称改编,对于标准调用约定的函数只能用模块定义文件的方式来导出函数
相关文章推荐
- 使用 __declspec(dllimport) 能够优化对DLL导出函数的调用.
- C/C++/动态链接库DLL中函数的调用约定与名称修饰
- C# DumpBin使用 查看反射C++ dll 动态链接库中的函数
- python中使用ctypes调用MinGW生成的动态链接库(dll)
- WPF中使用MFC动态链接库(dll)函数
- 使用.NE平台调用服务访问非托管 DLL 中的函数
- 案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下:
- electron 使用 node-ffi 调用 C++ 动态链接库(DLL)
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) \DLL内存使用
- C#加载dll(动态链接库)并调用其函数
- 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
- VC中使用动态链接库DLL:静态调用和动态调用
- .NET调用dll动态链接库函数
- 动态链接库DLL导出函数并导入使用
- 使用Java调用DLL动态链接库(如何在Java中调用DLL方法)
- 使用ida逆向分析dll动态链接库时,动态调式指定输出函数
- PowerShell 调用系统 DLL 中的函数,如何使用返回参数中的值
- 工作问题积累(十九)使用dumpbin命令查看.dll(动态链接库)中导出函数
- C# 调用 C++ dll 动态链接库中多个函数时全局变量的问题
- electron 使用 node-ffi 调用 C++ 动态链接库(DLL)