vc 创建Dll
时间:2011-05-06 来源:Yaoquan.Luo
vc 创建Dll
DLL(Dynamic Linkable Library)可以看成一些可以直接拿来用的变量、函数或类的集合。在库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:
(1)DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见
我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。
(3)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类库所编写的应用程序所调用。
一. Non-MFC DLL的编写步骤:
1、新建项目-> win32项目->应用程序设置->应用程序类型:选择DLL,完成。
2、添加变量、函数或类到库中,例如:
/* 文件名:xxx.h */
#ifndef XXX_H
#define XXX_H
#ifndef LIB_EXPORTS
#define LIB_API __declspec(dllimport)
#else
#define LIB_API __declspec(dllexport)
#endif
extern "C" int LIB_API max(int x, int y);
#endif
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
/* 文件名:xxx.cpp */
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
#include "xxx.h"
int add(int x, int y)
{
return x > y ? x y;
}
在动态库的工程属性->C/C++->预处理器->预处理器定义里,添LIB_EXPORTS。 编译。
3. 创建另外一个工程,来调用该库
调用DLL有两种方式:
<!--[if !supportLists]--> (1) <!--[endif]-->显式调用
typedef int (*pDllFunc)(int , int);
HINSTANCE hDll = LoadLibrary(_T("xxx.dll"));
pDllFunc pMax = NULL;
if (hDll) {
pMax = (pDllFunc)GetProcAddress(hDll, "max");
if (pMax) {
std::cout << pMax(21, 22) << std::endl;
}
}
if (hDll) {
FreeLibrary(hDll);
}
(2) 隐式调用
首先,包含该库的头文件
其次,链接动态库,把保存库的目录添加到工程属性->连接器->常规->附加库目录,在工程属性->连接器->输入->附加依赖项添加库的lib文件名 或者在程序中用
#pragma comment(lib, ".\\lib\\xxx.lib")添加(若已经添加库的目录,就不需要相当路径,直接写lib文件名“xxx.lib”)
然后就可以直接用变量,函数或者类了。
注意:隐式调用和显示调用的区别:
隐式调用的方法比较方便,但DLL改变后,应用程序须从新编译。并且,所有所调用的DLL在应用程序加载的同时被加载到内存中,当应用程序调用的DLL比较多时,装入的过程十分慢。显式调用则比较灵活,但比较麻烦.
二 MFC Regular DLL 的编写步骤:
1、新建项目->MFC DLL->应用程序设置->选择DLL类型,完成。
注意:静态链接MFC DLL和共享MFC DLL的区别:静态链接把程序中要用的在MFC DLL里的东西全部编译到创建的DLL中,体积会大一点,但可以在没有装MFC的机器上运行;通过共享创建的DLL体积小,但在没有安装MFC的机器上有可能不能运行,因为没有相应的库。
2、其他步骤和创建Non-MFC DLL差不多。
三 MFC扩展DLL
这里有比较详细的介绍http://tech.163.com/06/0316/10/2CB2S3HP0009159F.html。