vs2019有3个选项:共享的,静态链接的,扩展的。之前的貌似还有一个规则DLL。这里主要不是说这个,而是想记一下一个包含窗口的MFC DLL注入到其他进程后,如何显示的问题。
大多数人的需求,还是将窗口封装在DLL中,然后在自己的MFC程序中调用,这样的话,可以实现接口分离。然而有些比较特别的需求,DLL需要作为其他进程的一部分存在,并且能够处理消息。比如游戏外挂之类的玩意儿。最近也有个事情,需要用到这种方式,但是一直没成功,视频看了不少,代码也抄了不少,对于MFC,本人还是由一定的知识储备和认知。之所以困扰这么久才解决,其根本原因不在于如何或者何时显示窗口,是否需要开启单独的线程(当然这个也很重要),而是在于,你所编写的这个DLL,它所在的运行环境是什么样的,因为这决定了窗口是否能在其他进程中显示。有如下几种情况
1、DLL注入到了一个MFC的程序中。此时,MFC DLL项目可以是MFC 共享的项目,因为目标进程有MFC环境。
2、DLL被你自己的MFC程序调用,用以显示窗口,这种情况下,无论哪种DLL都可以,反正你要导出函数的,在导出的函数中,返回新创建的窗口的指针,然后调用之,这个网上有很多代码,就不细说了。
3、DLL注入到了一个非MFC程序中,并且要能够在该程序中正常显示窗口,这种情况下,MFC DLL项目就需要选择静态链接的MFC DLL。因为,这种方式编译的DLL,包含了该DLL需要用的所有的MFC环境,唯一的缺点就是编译出来的文件很大。外挂就用到的这个方式。其实现方式是:
1)在MFC DLL 项目(项目文件为:TestProj.h,TestProj.cpp,,,)中添加一个DIALOG资源,假设为IDD_DIALOG_TEST
2)在改DIALOG上右键,选择“添加类”,输入类名,假设类名是CTestDialogWnd
3)在TestProj.h中引入CTestDialogWnd.h
4)在TestProj.cpp中定义一个全局变量:CTestDialogWnd* pWndf = NULL;当然,也可以定义为成员变量或者局部变量,取决你对这个变量的需求。
5)在CTestProj::InitialInstance()函数中显示你的窗口