首先,为了能说得更清楚,我先举个例子!!
游戏外挂大家都知道吧!大家也都见过吧!!
我的程序就类似那样的一个效果.就是我说我在我的DLL里同创建了一个对话框资源,我想在我的程序里放一个按钮,当单击这个按钮时,我的程序执行一个HOOK注入到另一个程序,并能在那个程序窗口上弹出一个非模态的对话框!我用的标准的MFC  DLL.我在DLL里创建了一个对话框,并创建了一个类,而DLL里本身又有一个CHookApp这个类!我在这个类里定义一个CWnd变量用来装目标窗口类,并用安装HOOK时传进来 的一个HWND窗口句柄,调用CWnd::FromHandl()函数对这个CWnd赋值,然后就是创建对话框!代码如下:
void CHookApp::classTest()//自定义的函数
{
myCwnd = CWnd::FromHandle(wnd);//对我自定义的CWnd变量赋值
TestDlg *my =  new TestDlg();//这个就是那个对话框类
my->Create(MAKEINTRESOURCE(IDD_TestDIALOG1),myCwnd);//创建
my->ShowWindow(true};//显示
}可是这样做当执行时会弹出一个错误提示(就是那个红X,有"终止","重试","忽略")的提示框,然后目标程序就退出了!
不知道我错在哪里了!
还有,就是MAKEINTRESOURCE(IDD_TestDIALOG1)这块,如果我直接用资源ID就报错,编译都通不过!
后来我用这样的代码试还是一样的效果!
void CHookApp::classTest()//自定义的函数
{
myCwnd = CWnd::FromHandle(wnd);//对我自定义的CWnd变量赋值
myCwnd->MessageBox("aaaa",0,0);
}不知道为什么?请各位帮忙!

解决方案 »

  1.   

    CWnd变量是从另外个进程传过来的吗?如果是的话,当然不行了.进程间是隔离的.如果不是请参考下以下步骤:
    1:在函数头加上AFX_MANAGE_STATE(AfxGetStaticModuleState());
    2:自己新起UI线程,UI线程里出界面
    3:调试!
    在myCwnd   =   CWnd::FromHandle(wnd);//对我自定义的CWnd变量赋值 
    下断,然后把调试器附加到要注入的进程上,再运行注入程序对目标进程进行注入,我调试注入代码都是这样做的.非常方便.我也做过这样的程序,程序是一个网吧管理程序,客户端是个注入带winlogon的dll,会显示一个界面给用户上下机操作的.也是MFC DLL.