创建MFC图形界面dll

概述:

利用MFC的DLL框架,制作带有图形界面的dll,可以实现很多功能。

流程:

 

 

选择静态链接MFC DLL:以免有的库没有。

 

 

采用该框架创建的MFC,会自动生产一个MFC应用程序实例,但是我们还要添加一个图形界面,不然为啥不直接用DLL,而用MFC的DLL呢。

添加对话框:

右键项目,然后添加对话框资源:

 

 

 

 

右键该对话框给其添加一个类,不然的话只是一个界面,没有真正的引用它。

 

 

输入类名会自动生成相关文件:

 

 

注:这里如果添加类时,采用的是CDialogEx作为基类,需要在对应的对话框头文件中添加"afxdialogex.h头文件,因为VS不会自动添加。"

在MFC主函数中使用对话框:

MFC的正常框架是只有一个theApp。

前面我们创建了对话框类,但是还没有调用它,所以需要在MFC的theApp中调用该对话框。

在项目中对应的MfcDllTest1.cpp中添加以下代码:

 

 

#include"MfcTestDialog.h"
​
​
//使用对话框:
MfcTestDialog* pMfcTestDialog = NULL;
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    if (!pMfcTestDialog)
        pMfcTestDialog = new MfcTestDialog();
    pMfcTestDialog->DoModal();
    delete(pMfcTestDialog);
    FreeLibraryAndExitThread(theApp.m_hInstance, 0X0);
}
BOOL CMfcDllTest1App::InitInstance()
{
    CWinApp::InitInstance();
    ::CreateThread(NULL, NULL, ThreadProc, NULL, NULL, NULL);//新添加
    return TRUE;
}

 

解释一下这几行代码的原因:

在InitInstance()中创建线程是以免dll中创建模态对话框卡住。

MfcTestDialog* pMfcTestDialog = NULL;//创建类实例变量
DWORD WINAPI ThreadProc(LPVOID lpParameter)//线程函数
{
   if (!pMfcTestDialog)
       pMfcTestDialog = new MfcTestDialog();
   pMfcTestDialog->DoModal();//调用模态对话框
   delete(pMfcTestDialog);//关闭对话框后,删除该变量
   FreeLibraryAndExitThread(theApp.m_hInstance, 0X0);//删除该dll模块,并退出线程
}

测试代码:

生成dll后,随便注入到一个进程中查看是否有对话框生成。

(注:这里我生成的是x64的dll,需要注入到x64进程)

这里我注入到了windows的记事本进程中:

 

 

结果和我们预期一样。