一、VC动态链接库的分类
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
二、静态链接库的编写与使用
1. 静态链接库的编写
1) 新建一个静态链接库工程
2) 给工程新建lib.cpp文件,添加库函数代码:
#include "lib.h"
int add(int x,int y)
{
return x + y;
}
3) 新建lib.h文件,添加声明:
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数
#endif
编译,将生成*lib文件。
2. 静态链接库的调用
新建工程,将头文件lib.h和*.lib拷到工程下。
在main.cpp文件前面,添加如下代码:
#include "lib.h"
#pragma comment( lib, "ibTest.lib" ) //指定与静态库一起连接
这样就能使用库中的函数int add(int x,int y)了。
(注:#pragma comment( lib, "ibTest.lib" ) 这一句也可以在设置中代替:tools->options->directories->library files中,填入库文件路径)
还有一种方法,(需在dllTest工程中添加lib.def文件)
下面的代码演示了怎样同.def文件将函数add声明为DLL导出函数(需在dllTest工程中添加lib.def文件):
; lib.def : 导出DLL函数
LIBRARY dllTest
EXPORTS
add @ 1
.def文件的规则为:
(1)LIBRARY语句说明.def文件相应的DLL;
(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
由此可以看出,例子中lib.def文件的含义为生成名为“dllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1。
(摘自http://blog.csdn.net/hnarke/archive/2008/04/10/2277557.aspx)
三、动态链接库
1. 动态链接库的编写
建一个动态链接库工程,其他与静态链接库一样。
2. 动态链接库的调用
1) 在头文件或CPP文件前面定义函数指针类型:
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
2) 定义句柄及调用代码如下:
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("..//Debug//dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}