什么是动态库?

  动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库。

动态链接提供了一种方法 ,使进程可以调用不属于其可执行代码中的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。

  

动态链接与静态链接区别?

  我们都知道,我们在编程时会调外部库函数,因为程序的中许多代码都是可以复用的,调用外部函数就大大的简化了我们的工作量。代码编写完成后,需要编译才能运行,在编译的过程中,会把程序中调用的函数库加载到内存里。这就是静态链接方式。

假如有一个函数库,A程序要使用它,然后把函数库的内容全部加载自己的程序中。B程序也要使用这个函数库,B程序也把函数库的内容也全都加载到自己的程序中;这样同样一个东西重复出现在多个程序中,就会造成是种内存的浪费。所以,我们把被多个程序调用的函数放在一个公其的地方,就这一份。谁需要谁调用。这就是动态链接方式。

  可使用Dependency Walker工具来查看dll,参见:http://www.cnblogs.com/defias/p/3280561.html

Loadrunner为什么要使用动态库?

  DLL最重要的一个特点就扩展应用程序的特性。 再强大的工具也有不是万能的,通过调用动态库的方法极大地增强loadrunner的功能。当你在用loadrunner对于某些需求的测试感鞭长莫及时,这也是一种思路或方式。

Loadrunner如何使用动态库?

  LR选择http协议时支持的DLL为严格的C语言的DLL,对于C++编写的DLL需要在头文件中增加编译语句:extern "C",下面分别就VC和VS上创建可供LR调用的DLL编写的基本步骤进行介绍。

1)VC中创建动态库

下面通过VC++ 6.0中文版来创建一个动态函数。

1.1  打开VC++ 6.0,新建一个工程,这里先择工程类型为“Win32 Dynamic-link Library”,起一个工程名称,并选择好存方位置。  
      

1.2  点击“确定”按钮,会询问你希望创建什么类型的DLL?我们选择第三项“一个可以导出某些符号的DLL工程(D)”。点击确定,系统会给我们创建两个文件MyDLL.h和MyDLL.cpp。

  

1.3  分别对两个文件进行编写代码,因为这里创建的为.CPP文件,即C++的文件,因此头文件中需要加:extern "C",如果此处新建的是.c文件,则头文件中不能加:extern "C",且同样可以供LR调用。

  MyDLL.h

     extern "C" MYDLL_API int lr_demo(int,int);
 MyDLL.cpp

 MYDLL_API int lr_demo(int x ,int y)
{
int sum;
sum = x + y; return sum;
}

1.4  选择“工具”菜单---组建[MyDLL.dll] 或直接按F7程序进行编译。 编译完成后,提示没有错误与警告,说明我们成功了!

------------------Configuration: MyDLL - Win32 Debug--------------------

Compiling...
MyDLL.cpp
Linking...
Creating library Debug/MyDLL.lib and object Debug/MyDLL.exp MyDLL.dll - error(s), warning(s)

1.5  在loadrunnre中调用动态库,打开我们的loadrunner 的VuGen ,写入下面代码。

 vuser_init()
{ int ret; ret=lr_load_dll("C:\\Users\\Administrator\\Desktop\\loadrunner\\MyDLL\\Debug\\MyDLL.dll"); //调用我们本地的函数文件,因为单斜杠(\)会被C语言转义,所以要用两个斜杠(\\)来表示路径。 if(ret!=) return -; return ;
}
 Action()
{ int sum; sum=lr_demo(,); //lr_demo 与我们vc++中的函数名一致 lr_output_message("this sume is :%d\n",sum); //输出运算结果 return ;
}

运行结果:   

Starting iteration .
Starting action Action.
Action.c(): this sume is :
Ending action Action.
Ending iteration .

  从上面的代码看出。我们的loadrunner中并没有对数据进行计算,真正计算的代码是调用DLL函数库的代码。这样就大大增强了loadrunner的能力,而这种方式也使我们测试结果更加准确。

2)VS中创建动态库
2.1  打开VS,我在这里装的是VS2010,新建一个Win32控制台应用程序项目test1。

2.2 选择应用程序类型为DLL并为空项目

2.3  创建完工程后,分别在头文件和源文件夹下新建一个.h头文件和一个.c源文件或.cpp源文件(默认)

2.4  对于C语言,分别编写如下代码:

test1.h:

 typedef int abc;

 _declspec(dllexport) abc desinit(abc a, abc b);

 _declspec(dllexport) abc desdone(abc a, abc b);

test1.c:

 abc desinit(abc a, int b)
{
if(a>=b)
return a;
else
return b;
} abc desdone(abc a, abc b)
{
if(a>=b)
return b;
else
return a;
}

对于C++语言(CPP),分别编写如下代码:

test2.h:

 extern "C" _declspec(dllexport) int desinit(int a, int b);

 extern "C" _declspec(dllexport) int desdone(int a, int b);

test2.cpp:

 #include "test2.h"

 int desinit(int a, int b)
{
if(a>=b)
return a;
else
return b;
} int desdone(int a, int b)
{
if(a>=b)
return b;
else
return a;
}

2.5  点击生成后,在工程目录下的Debug目录下回生成DLL文件。

2.6  拷贝以上DLL文件到我们的LR的脚本目录下,或在脚本区域点右键选择Add Files to Script,弹出框选择DLL文件

编写加载DLL文件,调用DLL中函数的脚本并运行,如下:

  在VS中创建动态库DLL,除了以上方式外,还可以在新建项目时直接新建一个空项目,然后再分别创建头文件和源文件,点击工程名称右键点击属性,在如下对话框中配置类型和扩展名为DLL。然后进行生成已得到DLL文件。

这里选择MT时生成的dll依赖的库可能比默认的MD会少一些

DLL依赖:

可以通过depends.exe工具查看dll依赖哪些其他的dll库,如下所示,LIBEAY32.DLL为第三方编译的库(与系统自带的不是同一个):

 尽量使提供给LR调用的dll只依赖系统自带的dll库,比如:当需要依赖其他第三方库时(openssl、google buffer等...)将第三库编译成静态库使用。

LR调用动态链接库DLL的更多相关文章

  1. BCB如何编写,调用动态链接库DLL

    一 编写动态链接库DLL DLL简称动态链接库,是Windows中程序的重要组成部分.想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个 ...

  2. ASP.net/C#中如何调用动态链接库DLL

    动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文 ...

  3. 可执行Jar包调用动态链接库(DLL/SO)

    踩过了很多的坑,查了很多资料,在此记录一下,以SpringBoot项目为基础. Maven加入JNA依赖 <!-- JNA start --> <dependency> < ...

  4. JAVA调用动态链接库(dll)

        菜鸡爬坑 基础知识  因为某个东西的keygen我只会在win下生成!! 所以只能出此下策!!之前一直是android下用jni调用so文件,现在试下java在win平台下调用dll 首先还是 ...

  5. JAVA调用动态链接库DLL之JNative学习

    package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import ...

  6. 制作和unity调用动态链接库dll文件

    首先用vc建立一个dll工程 然后在里面建立一个testunity.h文件.内容如下 1 extern "C" int _declspec(dllexport)testunity( ...

  7. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

    转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...

  8. VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性

    本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为"JAVA调用动态链接库DLL之JNative学习"中使用的DLL,仅仅是项目及文件名不同. ...

  9. 编译可供C#调用的C/C++动态链接库dll文件

    编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...

随机推荐

  1. Linux下可以替代windows的软件汇总:(不断完善中)

    http://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=9530 原则:不求全面,只求实用.主要针对桌面级应用.网购:  ...

  2. Ubuntu 15.10系统安装后要做的15件事

    Ubuntu 15.04发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java ...

  3. poj 2923 状压dp+01背包

    好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...

  4. Effective C++笔记:资源管理

    资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...

  5. 前端调试效率低?试试这10个“Chrome开发者工具”使用技巧

    摘要:今天给大家分享一些使用“Chrome开发者工具”的小技巧.包括调试,优化页面渲染速度等.希望能提升Web开发人员的工作效率. 今天给大家分享一些使用“Chrome开发者工具”的小技巧.包括调试, ...

  6. TeeChart注册方法

  7. mysql数据库版本引发的问题

    改前: 改后:

  8. JS一个根据时区输出时区时间的函数

    做项目遇到的坑爹问题,需要根据时区获取时区中轴线的时间.为此搜了好久网上都没什么JS的代码描述到这一方面,最后自己翻了下高中地理才写了个函数出来. 此图可以看出来,全球分为了0时区,东西1-11区,第 ...

  9. Memcached启停脚本小结

    编写配置文件 编写启动脚本 vim /etc/rc.d/init.d/memcached startesac and $<!= 0); } elsif (open PIDHANDLE," ...

  10. Android 2D游戏引擎AndEngine配置环境

    Android 2D游戏引擎AndEngine配置环境 1.2  配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和 ...