动态库DLL文件的动态调用和静态调用
参考百度百科和C++调用DLL有两种方法—静态调用&动态调用
库文件一般指计算机上的一类文件,分两种,一种是静态库,另一种是动态库即DLL(Dynamic Link Library)文件,又叫动态链接库文件。静态库和动态库的区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存*程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存,而且使用动态库也便于模块化更新程序。
一、DLL意义
DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。
二、DLL调用方式
(1) 静态调用
步骤如下:
1、把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2、把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3、把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;
4、打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5、执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框输入:youApp.lib
6、选择你的目标工程Head Files加入:youApp.h文件;
7、最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include “youApp.h”
注:youApp是你DLL的工程名。
.lib是一种文件名后缀,代表的是静态数据连接库,在windows操作系统中起到链接程序和函数(或子过程)的作用,相当于Linux中的.a或.o、.so文件。
LIB文件中存放的是函数调用的信息,数据库有静态数据库(.lib文件)和动态数据库(.dll文件)
一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就要连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件静态编译出来的,索引和实现都在其中。
(2) 动态调用
是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
1、把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.、在程序中使用以下代码
{
HINSTANCE hDllInst = LoadLibrary(“youApp.DLL”);
if(hDllInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函数别名
youFuntionNameAlias = (MYFUNC)GetProcAddress
(hDllInst,”youFuntionName”);
// youFuntionName 在DLL中声明的函数名
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
在Windows系统中,与动态库调用有关的函数包括:
①LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。