概述
DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类。
仓库的发展史经历了"无库" ---> "静态链接库" ---> "动态链接库"。
静态链接库与动态链接库都能实现共享代码,如果使用静态链接库,编译后lib中的指令会被包含在生成的EXE文件中,如果使用动态链接库,则不会被包含到EXE文件中,EXE文件执行时动态加载和卸载dll文件。
库的分类
1.Win32库(非MFC)库
Win32库又分为:动态链接库和静态链接库
Win32库不采用MFC类库结构,导出函数为标准的C接口,可以被MFC或非MFC编写的应用程序调用。
2.MFC库
MFC库又分为:MFC规则DLL和MFC扩展DLL
MFC规则DLL:包含一个集成自CWinApp的类,但其无消息循环。
MFC扩展DLL:采用MFC的动态链接库创建,它只能被MFC编写的应用程序调用。
创建MFC动态链接库
使用vs2010进行创建
1.“新建项目” 项目名为"wnMFCdll”--->选择"MFC dll" --->选择"MFC 扩展 DLL",点击完成:
创建头文件wnMFCdll.h,添加如下代码:
#ifndef _WNMFCDLL_H
#define _WNMFCDLL_H
class Student
{
public:
void WN_SetAge(int age);
void WN_SetName(char* p);
void WN_Printf();
private:
int age;
char name[32];
};
#endif
源文件wnMFCdll.cpp 添加如下代码:
// wnMFCdll.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include <stdio.h>
#include "wnMFCdll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
void Student::WN_SetAge(int age)
{
this->age = age;
}
void Student::WN_SetName(char* p)
{
strcpy(this->name, p);
}
void Student::WN_Printf()
{
printf("name = %s; age = %d", name, age);
}
在wnMFCdll.def文件中添加如下内容:
; wnMFCdll.def : 声明 DLL 的模块参数。
LIBRARY
EXPORTS
; 此处可以是显式导出
WN_SetAge
WN_SetName
WN_Printf
编译该项目,会在Debug目录下生成wnMFCdll.dll和wnMFCdll.lib两个文件
调用MFC动态链接库
鼠标在解决方案右击 ---> "添加" ---> "新建项目",项目名称为"wnMFCTest",选择win32控制台项目,勾选"控制台应用程序"和"MFC"
修改源文件wnMFCTest.cpp内容如下:
// wnMFCTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "wnMFCTest.h"
#include "../wnMFCdll/wnMFCdll.h"
#ifdef _DEBUG
#pragma comment(lib, "../Debug/wnMFCdll.lib")
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//测试MFC dll
//Student stu(18, "wangpengfei");
Student stu;
stu.WN_SetAge(30);
stu.WN_SetName("woniu201");
stu.WN_Printf();
return 0;
}
编译连接生成libTest.exe文件,执行结果如下:
欢迎加群交流:C/C++开发交流