一、什么是MFC
微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量.其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类.我们之前接触到的是控制台,这里我们就可以接触到了窗口.
二、DLL
动态链接库英文为DLL,是Dynamic Link Library的缩写.
DLL是一个包含可由多个程序,同时使用的代码和数据的库,这里暂且简单的了解下就行 后面还会细致的分析.
三、创建第一个MFC DLL
3.1 创建项目
3.1.1 选择文件-选择项目-选择MFC/ATL-选择MFC动态链接库
3.1.2 设置项目名称-设置项目存放路径-点击确认
3.1.3 选择DLL类型为静态链接到MFC的常规DLL-点击确认-即可完成MFC DLL的创建
3.1.4 我们在解决方案资源管理器中可以看到我们创建的项目的目录结构,会比之前我们创建的控制台项目多出很多源文件.这些文件主要是MFC框架的一些初始化和配置,是编译器为我们生成好的.
3.2 基本介绍
主要介绍2个基本函数
我们点击查看MFCLibrary1.cpp
会看到这个初始化函数
当DLL被加载后会触发函数InitInstance() 常常做一些初始化工作 比如窗口的创建 显示 等等
有了初始化当然也会有一个清理资源函数的触发
当DLL被卸载了会触发函数ExitInstance(); 做一些资源清理工作 比如 对象的释放 等等
virtual BOOL InitInstance();//当DLL被加载的时候 会调用 我们可以用来 对 窗口的创建和 显示 还有一些初始化操作
virtual int ExitInstance();//当DLL 被卸载的时候 调用 我们可以用来 对资源的清理 操作 比如 对象的释放等等
3.3 添加窗口
首先来看看怎么添加一个主窗口
3.3.1 右键点击资源文件-弹出菜单
3.3.2 选择添加-选择资源-弹出资源对话框
3.3.3 选择Dialog-选择新建-即可创建一个窗口
3.3.4 此时窗口创建成功
3.3.5 窗口资源添加后我们需要给窗口绑定一个类,右键点击窗口空白处-弹出菜单-选择添加类
3.3.6 弹出对话框- 设置一个自定义类名(MFCMainDialog)其他默认不变-点击确认
3.3.7 此时会多出一个MFCMainDialog.h 和 MFCMainDialog.cpp文件 这2个文件就相当于和刚才那个窗口绑定了(原理我们暂时不讲)
以后需要操作这个新建的窗口就需要对这2个文件做相应的修改
3.4 利用线程创建窗口
3.4.1 由于我们需要把刚才添加的窗口资源给创建显示出来,我们第一步需要添加与这个窗口绑定的2个文件中的头文件MFCMainDialog.h
在源文件MFCLibrary1.cpp中添加
3.5.2 在上节课中我们介绍了线程的创建,这里我们就不必多说.
现在需要在我们刚才介绍的当DLL被加载的函数InitInstance()中创建一个线程,然后在线程回调函数中创建一个模态窗口.
MFCMainDialog *pMFCMainDialog=NULL;
DWORD WINAPI ThreadCallBack(LPARAM lparam)
{
if(pMFCMainDialog)
pMFCMainDialog =new MFCMainDialog();
pMFCMainDialog->DoModal();//创建模态窗口 然后堵塞 等待窗口关闭后继续往下执行
FreeLibraryAndExitThread(theApp.m_hInstance, 1);//释放 会触发ExitInstance();
return 1;
}
BOOL MFCLibrary1::InitInstance()//当DLL 被调用的时候 触发这个函数
{
MFCLibrary1::InitInstance();//先调用父类的这个函数
::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadCallBacl, 0, 0, 0);//不会堵塞
return TRUE;
}
四、注入DLL验证是否创建成功
利用注入器把DLL注入到一个程序(注意DLL是32位还是64位注入到对应位数的程序中)中,观察是否窗口显示出来
迪大交流群:285530835