在开始写一个简单的dll前,先初步态库相关的一些知识。
MFC(Microsoft Foundation Classes)是微软的基础类库。其以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
DLL(Dynamic Link Library,动态链接库)是一个包含可由多个程序,同时使用的代码和数据的库。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。
使用dll的优点:
1.使用较少的资源,当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。
2.推广模块式体系结构DLL 有助于促进模块式程序的开发。
3.当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。
缺点:应用程序不能独立运行,需要在操作系统中另外安装对应的DLL。
下面通过两张图片来直观地理解静态库(.lib)和(.dll)的区别。
参考博文MFC下DLL编程(图解)
了解上述基本知识后,可开始创建编写一个简单的dll。
我使用的是 visual studio 2015。
文件—>>新建—>>项目
模板 —>> Visual C++ —> Windows —> MFC —> MFC DLL
在名称处输入项目名 ,我输入的dlltest1。
接着是MFC DLL 的项目向导
选择下一步
DLL类型选择第一个,使用共享 MFC DLL 的规则 DLL。然后点击完成。
三种类型的区别如下,按需选择:
1.共享MFC——DLL中不包含MFC库函数,需要另外安装MFC动态链接库后才能使用;
2.静态MFC——DLL中包含MFC库函数,可以脱离MFC动态链接库独立使用。
3.扩展DLL——扩展(extension)DLL中所定义的类和函数,只能被所MFC应用程序使用。而且扩展DLL中不能包含MFC库函数,也需要另外安装MFC动态链接库后才能使用。
项目生成后可以在解决方案资源管理器中里看到以下文件目录(没有看到解决方案资源管理器的在菜单栏里的视图里点开)。其中红色圈起来的(分别是以 你所创建项目名 为名字 以 .h、. cpp、.def 结尾的文件)文件是需要编写内容的。
接着先点开 dlltest1.h文件编写函数声明 。例如我想写一个求两整数和的函数,我的声明如下:
语句为
extern "C" int PASCAL EXPORT add(int a, int b);
简单解释一下这句语句。
首先 extern “C” 是为了 该函数能够被 非MFC程序 调用。不然在编译时,编译器会使用C++类型安全命名约定(也称作名称修饰)和C++调用约定(使用此调用约定从C调用会很困难)。
int 是 函数类型
PASCAL 在windows编程中是个宏
#define PASCALL __stdcall
它就是一个调用约定,例如
extern “C” int PASCAL f(int i);
声明f函数是编译的,且调用约定为__stdcall。
__stdcall的意思就是在调用这个函数的时候,由被调用者就是它自己释放参数。
EXPORT此处可以是显式导出;
接着点开 dlltest.cpp 写函数的具体定义。
具体语句
extern "C" int PASCAL EXPORT add(int a, int b)
{
return a + b;
}
最后,在 dlltest2.def 里写
语句
add @1
其中 @1 表示可用序号1来调用该函数,若有其他定义的函数,则接着换行写 xx @2,xxx @3… nx @n 这么写。
最后根据你要用到此dll的平台的选择debug或release,以及x64或x86
然后点绿色箭头编译,输出以下生成成功信息(后面弹出dos窗口失败关掉就好,因为这个程序不打开黑色窗口按绿色按钮会一步完成所有操作所以报错)。
然后再项目位置里打开,找到dll就可以在你需要的平台动态库的存放位置加上使用了。
以上。如有错,还请赐教。