[英]mfc modeless dialog in dll destroyed when thread exit
我想从注入到另一个进程的MFC dll中打开MFC无模式对话框,该dll的工作是挂起winsock send&recv,该对话框将是与dll进行通信的界面。 对话框运行时,dll应该能够运行钩子。
BOOL CDriverApp::InitInstance()
{
CWinApp::InitInstance();
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
AfxMessageBox("I'm In!");
DetourTransactionBegin();
DetourUpdateThread( GetCurrentThread() );
DetourAttach( &(PVOID &)RealSend, MySend );
DetourAttach( &(PVOID &)RealRecv, MyRecv );
if ((DetourTransactionCommit()) == NO_ERROR)
{
AfxMessageBox("Winsock hooked");
}
dlg = new ControlDlg();
m_pMainWnd = dlg;
if(dlg->Create(IDD_CONTROL_DLG))
{
dlg->ShowWindow(SW_SHOW);
}
//ExitThread(0);
return TRUE; <---
}
dlg
是CDriverApp
成员的CDriverApp
根据我的观察,对话框已被破坏,因为线程已退出并且保存对话框的内存已被删除。
The thread '_DllMainCRTStartup' (0x418) has exited with code 1657602048 (0x62cd0000).
我已经阅读了MFC无模式对话框立即关闭线程,但是我的InitInstance()
从一开始就已经返回true
,所以这是一个不同的问题(我认为)
所以,我的问题是如何防止对话框被破坏? 还是阻止线程退出? 还是可以通过模式对话框来实现?
这可能是您的问题:
常规DLL与MFC应用程序一样,必须具有CWinApp派生的类和该应用程序类的单个对象。 但是,DLL的CWinApp对象没有主消息泵,应用程序的CWinApp对象也没有。
请注意,CWinApp :: Run机制不适用于DLL,因为应用程序拥有主消息泵。 如果DLL打开无模式对话框或拥有自己的主框架窗口,则应用程序的主消息泵必须调用DLL导出的例程,该例程又调用DLL的应用程序对象的CWinApp :: PreTranslateMessage成员函数。
http://msdn.microsoft.com/zh-CN/library/f22wcbea(v=vs.80 )
编辑:
这显示了如何使用cWnd而不是CDialog来执行操作。 我个人认为这是一个更好的方法。
http://codinganswer.com/c/cwnd-in-a-new-thread-in-a-dll.html
这是将消息挂钩附加到无模式的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.