DLL(Dynamic Link Library)是Windows平台下的动态链接库文件,是windows系统的核心技术。
从使用者角度看,DLL由入口函数(entry point)和导出表两部分组成,其中入口函数声明如下:
extern "C" BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpReserved ) // reserved { // Perform actions based on the reason for calling. switch( fdwReason ) { case DLL_PROCESS_ATTACH: // Initialize once for each new process. // Return FALSE to fail DLL load. break; case DLL_THREAD_ATTACH: // Do thread-specific initialization. break; case DLL_THREAD_DETACH: // Do thread-specific cleanup. break; case DLL_PROCESS_DETACH: // Perform any necessary cleanup. break; } return TRUE; // Successful DLL_PROCESS_ATTACH. }
这里强调入口函数是因为Linux下的动态库编译并不需要这个函数,只要加上--shared选项即可;该函数为Window下的DLL特有。
extern "C"关键字告诉编译器,按照C语言规范进行编译,防止导出函数C无法调用。
与Linux下的.so默认导出所有成员不同,DLL默认所有成员为“私有”,只有声明导出的成员才能被外部调用。按照MSDN说法,可以通过以下两种方式导出成员:
其中第二种方法更常见。
这里的示例为了测试方便直接在LoadRunner11中调用,输出函数直接调用LoadRunner内置函数;
#include "D:\Loadrunner11\include\lrun.h" #include "stdafx.h" #include "base64.h" /** * 自定义导出函数 */ extern "C" { int __declspec(dllexport) Run (char *userName, char *pass) { int src_len = strlen(pass); int dst_len = Base64encode_len(src_len); char* dst = (char*)malloc(dst_len); lr_output_message("pass:%s, src_len:%d, dst_len:%d", pass, src_len, dst_len); int encoded_len = Base64encode(dst, pass, src_len); //size_t len = 0; //char* dst = base64_encode(src_msg, sizeof(src_msg), len); lr_output_message( "We are on iteration: %s, userName: %s, Passwd: %s", lr_eval_string("{iter}" ), (char*)userName, dst); //base64解码 int decode_len1 = Base64decode_len(dst); //int Base64decode(char *bufplain, const char *bufcoded) char *decoded1 = (char*)malloc(decode_len1); if(decoded1 == NULL){ infos("内存分配失败"); return 0; } memset(decoded1, 0, decode_len1); Base64decode(decoded1, dst); lr_output_message("Secret:%s", decoded1); free(dst); free(decoded1); return 0; } }
LoadRunner原生接口支持DLL调用,因为变量声明需要放在函数起始位置,所以DLL加载放在init中更合适:
vuser_init() { lr_load_dll("E:/LRWorkSpace/testdll/testHPlr/testHPlr.dll"); return 0; }
在Action中调用DLL接口做业务:
Action() { char *user_name = "Michael Sylvester Gardenzio Stallone(西尔维斯特·史泰龙)"; char *pwd = "ppnn13%dkstFeb.1st"; int src_len = strlen(pwd); int dst_len = Base64encode_len(src_len); char * encode_pwd = (char*)malloc(sizeof(char) * dst_len); //调用1 Init(user_name, pwd); lr_output_message("Src length: [%d], Target length: [%d]\n", src_len, dst_len); //调用2 Base64encode(encode_pwd, pwd, src_len); lr_log_message("base64:[%s]", encode_pwd); free(encode_pwd);//attention return 0; }
此处C函数声明和C++和Java面向对象语言不同(面向对象时只要释放对象实例即可),有一个技巧,申请的内存需要考虑释放,所以C函数大概有以下声明方式:
1、两步调用,由调用者提供所有内存空间
int base64_len(const char *input_plain);
void base64(const char *input_plain, char* output_eoncoded)
由于输出长度不确定,所以先调用base64_len预计算长度,然后根据长度分配output_eoncoded内存空间
注意事项
测试过程中发现,Loadrunner变量声明需要在函数开始处,在函数中部声明变量会提示
Action.c (14): illegal statement termination Action.c (14): skipping `char' Action.c (14): undeclared identifier `t'
另外通过malloc/calloc或new在运行期间分配的空间需要手动释放,通过char[100]方式在编译期分配的空间无需释放,所以在已知大小的情况下用此方式更安全简洁。
参考链接:
https://msdn.microsoft.com/en-us/library/z4zxe9k8.aspx
相关推荐
在loadrunner中调用dll~
当我们使用VuGen时, 允许我们调用外部的DLL定义的函数。通过调用外部DLL中的函数,可以减少我们的脚本在整个运行期间内存消耗。 调用外部DLL的方法有两种: 1.(单个脚本中)在脚本中是使用 lr_load_dll 函数。 2...
LoadRunnerLoadrunner软件测试工具LoadRunner调用一个简单Dll例子LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对...
LoadRunner调用外部DLL的方法 LoadRunner调用外部DLL的方法
Loadrunner调用DLL文件函数.pdf
课程Loadrunner调用DLL文件函数.pdf
LoadRunner测试过程中调用dll文件的制作与使用.
LoadRunner测试过程中调用dll文件的制作与使用 1、dll文件的制作 在Visual C++6.0开发环境下,打开File-New-Project选项,可以选择Win32 Dynamic-Link Library来创建一个名为dllfortest的空的dll工程(这只是方法...
原创文档,为了挣点分,拿自己的文档争分loadrunner调用dll文件
希望大家在使用LoadRunner时不仅仅停在只是录制/播放角本,而全面提升角本的编程技术,解决复杂场景。 本次测试中碰到的问题是这样的,在消息的传送过程中遇到了DEC加密的过程,LoadRunner录制到的全是加密的消息...
。。。
。。。
需要替换的两个文件名:lm70.dll mlr5lprg.dll LoadRunner11的license问题: 提供一个超级license 最高支持6.5w个并发:AEACFSJI-YJKJKJJKEJIJD-BCLBR 5. qtp 的资源池 file→settings→resource里添加...
如何通过LoadRunner监控Linux和Unix操作系统的资源状况 LoadRunner函数介绍 LoadRunner函数介绍续 LoadRunner与Winsock协议[翻译] LoadRunner下DLL的调用 Mercury LoadRunner 8.1 使用前...
在Controller中配置WebSphere监控器 LoadRunner下DLL的调用 Session与Cookie区别 DNS域名解析服务器工作原理
loadRunner看法关于loadrunner安装和卸载的一下看法[2]软件测试全部完成后重启电脑,该问题就解决拉:)LR终于装好了。那就意味这,BHOManager.dll的注册是和atl.dll的注册有关,前者调用后者中的东西,只要后者成功...
1 概览 1 1 2 ...3.6 C语言调用dll 扩展测试脚本 11 3.7 Apache/jboss/weblogic/oracle性能优化 11 3.8 计算机性能评测研究方向 11 3.9 Mercucy performance center 12 4 性能测试书籍 13 5 测试网站
IP欺骗(IP Spoofer) 调用DLL中自定义的函数 分析以及监视场景 分析实时监视图表 利用Analysis分析结果
在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库...