马上注册,结交更多好友,享用更多功能,让你轻松玩转无忧吧。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
C++ MFC 之动态链接库dll 窗口教程
[backcolor=rgba(255, 255, 255, 0.9)]对于一般的 dll 文件,我们可以在其他的 exe 文件中进行导入,并使用从该 dll 文件中导出的函数,同样的,MFC 程序也可以编译成动态链接库的形式。 [backcolor=rgba(255, 255, 255, 0.9)]当然我们今天讨论的主题是编写一个图形化界面的 MFC dll,通过注入工具将该 dll 注入到其他程序,然后打开我们编写的图形化界面。 一、编写 MFC 动态链接库[backcolor=rgba(255, 255, 255, 0.9)]首先我们需要新建一个 MFC 动态链接库 项目,并指定如下类型:
注:通过指定静态链接属性,当我们的 dll 程序可以运行在没有 mfc140.dll 的系统上。 1 新建一个窗口并与类文件绑定[backcolor=rgba(255, 255, 255, 0.9)]此时,我们需要新建一个窗口,该窗口就是用于接收我们各种操作的窗口,右键资源文件 -> 添加 -> 资源,选择 Dialog 新建:
[backcolor=rgba(255, 255, 255, 0.9)]此时就生成了窗口,我们也可以对窗口进行各种属性的设置,如窗口标题、大小等。然后我们需要右键该新建窗口 -> 添加类,将其与类文件绑定,指定基类为 CDialog:
CDialogEx 基类比 CDialog 基类的功能更加丰富,适用于 XP 以后的系统,而 CDialog 基类更加简单,兼容性更强,后面演示代码基于 CDialog 基类。
[backcolor=rgba(255, 255, 255, 0.9)]然后在主文件中添加刚刚新建的类头文件:
[backcolor=rgba(255, 255, 255, 0.9)]
2 在 MFC 初始化函数中开启模态对话框线程[backcolor=rgba(255, 255, 255, 0.9)]通过上面的操作新建好对话框后,我们接下来需要在 MFC 动态链接库初始化的时候开启一个线程,该线程用于启动我们刚刚创建的模态对话框,下面是 MFC 动态链接库的初始化函数:
// CMFCLibrary1App 初始化BOOL CMFCLibrary1App::InitInstance(){ CWinApp::InitInstance(); return TRUE;}注:当 DLL 被加载后会触发该函数做一些初始化工作,如窗口的创建、显示等(对应的卸载函数为 ExitInstance())。
[backcolor=rgba(255, 255, 255, 0.9)]接下来我们编写线程函数,并开启一个线程执行该函数: [backcolor=rgba(255, 255, 255, 0.9)]
// 注入 dll 后用于打开窗口的线程回调函数CMainDialog* pCMainDialog = NULL;DWORD WINAPI ThreadFunction(LPARAM lparam){ pCMainDialog = new CMainDialog(); pCMainDialog->DoModal(); // 创建模态对话框然后堵塞,等待窗口关闭后才会继续往下执行 FreeLibraryAndExitThread(theApp.m_hInstance, 1); // 释放,会触发 ExitInstance() 函数 return 0;}// CMFCLibrary1App 初始化BOOL CMFCLibrary1App::InitInstance(){ CWinApp::InitInstance(); if (!::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, NULL, 0, NULL)) { MessageBoxA(NULL, "CreateThread() error", NULL, 0); } return TRUE;}二、注入 MFC dll[backcolor=rgba(255, 255, 255, 0.9)] [backcolor=rgba(255, 255, 255, 0.9)]选择一个任意的注入软件,并选择一个任意的进程注入,效果如下: [backcolor=rgba(255, 255, 255, 0.9)]
三、调试 MFC dll[backcolor=rgba(255, 255, 255, 0.9)]如果是需要调试 exe 文件,直接可以在 VS 编译器里面点击调试器运行即可,但是 dll 文件如何调试呢? [backcolor=rgba(255, 255, 255, 0.9)]以调试刚刚编写的 dll 为例,我们首先打开待注入的进程,这里是 notepad.exe,然后点击 VS 的调试 -> 附加到进程,然后找到我们待注入的进程进行附加:
[backcolor=rgba(255, 255, 255, 0.9)]
[backcolor=rgba(255, 255, 255, 0.9)]
[backcolor=rgba(255, 255, 255, 0.9)]
[backcolor=rgba(255, 255, 255, 0.9)] [C++] 纯文本查看 复制代码 auto dlg = new CMainDialog;
//取的dlg的指针,做消息循环使用
m_pMainWnd = dlg;
dlg->DoModal();
|