`

Windows平台DLL开发及LoadRunner调用

 
阅读更多

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

    在某些特定情况下,可能需要利用 LoadRunner 的灵活性,调用自定义的动态链接库(DLL)来实现特定功能或扩展其能力。以下是一个关于如何在 LoadRunner 中调用 DLL 的详细步骤和相关知识点。 首先,创建 DLL 文件是...

    悟透LoadRunner - 调用外部DLL的方法

    ### 悟透LoadRunner —— 调用外部DLL的方法 #### 引言 在LoadRunner中,通过调用外部动态链接库(DLL)来扩展脚本功能是一种常见的优化手段。这种方法不仅可以帮助减少脚本运行时的内存占用,还可以促进代码重用...

    LoadRunner测试过程中调用dll文件的制作与使用

    在LoadRunner测试中,调用DLL文件是一种常见的增强测试功能的方法。DLL(Dynamic Link Library)文件是Windows操作系统中的一种共享库,它包含了可被多个应用程序同时使用的代码和数据。在LoadRunner测试过程中,...

    软件测试工具LoadRunner调用一个简单Dll例子

    LoadRunnerLoadrunner软件测试工具LoadRunner调用一个简单Dll例子LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对...

    课程Loadrunner调用DLL文件函数.pdf

    总之,LoadRunner调用DLL文件函数是提高脚本效率和重用性的重要手段,通过正确的方式引入和使用DLL,可以更好地实现测试目标。无论是单脚本调用还是全局设置,都应确保遵循DLL的要求和LoadRunner的规则。

    Loadrunner调用DLL文件函数.pdf

    总结,LoadRunner调用DLL文件函数是提升脚本效率和功能的有效手段。理解如何创建、加载及调用DLL,以及解决远程调用时的问题,对于进行高效和灵活的性能测试至关重要。更多详细信息,可以查阅LoadRunner的帮助文档:...

    LoadRunner_dll.rar_LoadRunner_loadrunner d

    - 确保DLL的编译平台与LoadRunner的运行环境兼容。 - 对于复杂的DLL,可以考虑使用COM(Component Object Model)或.NET组件,它们提供了更高级别的接口和错误处理机制。 - 尽量减少DLL的依赖性,避免引入不必要...

    Loadrunner加载DLL和调用命令行程序的方法.docx

    Loadrunner加载DLL和调用命令行程序的方法 Loadrunner 是一个功能强大的性能测试工具,它可以模拟大量用户的行为,来测试系统的性能和可靠性。在 Loadrunner 中,我们可以加载外部的 DLL 文件,以便调用其中的函数...

    Loadrunner加载DLL和调用命令行程序的方法.pdf

    Loadrunner 加载 DLL 和调用命令行程序的方法 Loadrunner 是一款功能強大的性能测试工具,它可以模拟大量用户对服务器的并发访问,从而评估服务器的性能和可扩展性。在 Loadrunner 中,我们可以加载 DLL 文件和...

    Loadrunner 在linux系统下调用dll方法

    ### Loadrunner 在 Linux 系统下调...以上内容不仅提供了详细的安装指导,还涵盖了配置过程中的关键步骤及常见问题的解决方案,对于想要在 Linux 平台上使用 LoadRunner 进行性能测试的用户来说是一份非常实用的指南。

    动态获取数据库中的数据作为loadrunner的参数替换GetData.dll

    2. **使用GetData.dll**:由于“GetData.dll”是一个DLL文件,它可能是由开发人员编写的,用于封装与数据库交互的逻辑,比如执行SQL查询、处理结果等。这样,测试团队无需在脚本中直接编写这些复杂操作,而是通过...

    loadrunner通过动态链接库实现自定义时间戳

    3. **在LoadRunner中调用DLL**:在LoadRunner的VuGen(虚拟用户生成器)中,将DLL导入到项目中。这可以通过“资源”菜单 -> “添加” -> “库”来完成。确保库路径正确,并且库中的函数名符合LoadRunner的调用约定。...

    cjson编译好的动态链接库,so和dll,32位

    "cjson.dll"则是CJSON在Windows平台上的32位动态链接库。在Windows下,开发者通常使用Visual Studio或其他编译工具,通过设置项目属性来链接这个库。在LoadRunner这样的性能测试工具中,可以直接使用这个动态链接库...

    LoadRunner测试Tuxedo应用的两种方式

    第二种方法是通过编写可以被LoadRunner调用的动态链接库(DLL)来实现性能测试,这种方式更灵活且易于扩展。具体步骤如下: 1. **编写DLL**:使用Visual C++ 6.0开发环境编写一个DLL,该DLL包含了调用Tuxedo服务所需...

    MySQ LoadRunner libraries下载

    在Windows系统中,它们通常是.dll文件,而在Linux或Unix系统中,可能是.so文件。这些文件是LoadRunner与MySQL通信所必需的,它们包含了LoadRunner控制器和虚拟用户脚本与MySQL服务器交互时需要调用的函数和接口。将...

    如何使用LoadRunner调用外部DLL动态链接库

    希望大家在使用LoadRunner时不仅仅停在只是录制/播放角本,而全面提升角本的编程技术,解决复杂场景。  本次测试中碰到的问题是这样的,在消息的传送过程中遇到了DEC加密的过程,LoadRunner录制到的全是加密的消息...

    用LoadRunner测试Winsock应用的例子(英文PDF) .pdf

    在当今流行的微软Windows和IBM OS/2操作系统下的互联网应用程序,都是依据WinSock标准开发的。 WinSock是一个动态链接库(.DLL),运行在Windows环境下。具体而言,`WINSOCK.DLL`充当了与TCP/IP的接口,并由此连接...

    初始LoadRunner动态链接库

    5. **在LoadRunner中调用**:在Vuser脚本中使用`lr_load_dll()`加载DLL,然后通过`lr_call_dll_function()`调用DLL中的函数。 ### 注意事项 - 确保DLL与LoadRunner环境兼容,包括32位和64位版本的匹配。 - 正确...

Global site tag (gtag.js) - Google Analytics