线程退出时 DLL 中的 MFC 无模式对话框被销毁
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
成员的对话框
据我观察,对话框被破坏了,因为线程已经退出,保存对话框的内存被删除了。
The thread '_DllMainCRTStartup' (0x418) has exited with code 1657602048 (0x62cd0000).
我已经阅读了MFC无模式对话框立即关闭线程,但是我的InitInstance()
从一开始就已经返回了true
,所以这是一个不同的问题(我认为)
所以,我的问题是如何防止对话框被破坏?或者也许阻止线程退出?或者它可以通过模式对话框来实现吗?
这可能是你的问题:
常规 DLL 必须具有 CWinApp 派生的类和单个对象 该应用程序类,MFC 应用程序也是如此。然而, DLL 的 CWinApp 对象没有主消息泵,就像 应用程序的 CWinApp 对象。
请注意,CWinApp::Run 机制不适用于 DLL,因为应用程序拥有 主消息泵。如果 DLL 打开无模式对话框或具有主 框架窗口本身,应用程序的主消息泵必须调用 DLL 导出的例程,该例程又调用 CWinApp::P重新翻译 DLL 应用程序的消息成员函数 对象。
http://msdn.microsoft.com/en-US/library/f22wcbea(v=vs.80)
编辑:
这显示了如何使用cWnd而不是CDialog来做你正在做的事情。 就我个人而言,我认为这是一个更好的方法。
http://codinganswer.com/c/cwnd-in-a-new-thread-in-a-dll.html
下面是将消息挂钩附加到无模式的示例。
http://support.microsoft.com/kb/q187988/
- 如何检测窗口当前是否正在运行模式对话框?
- wxWidgets - 阻止 OS X 上的窗口模式对话框
- 如何在另一个线程中关闭 MFC 模式对话框并获取对话框返回值?
- 防止模式对话框中的事件循环阻塞
- 从模式对话框中退出 MFC 应用
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- MFC 结束对话框崩溃时模式对话框没有焦点
- 将焦点设置在MFC视图中托管的无模式对话框上
- 模式对话框不会作为最上面的窗口打开
- 从无模式对话框启动CFileDialog时会冻结
- 使用ESC键取消Carbon模式对话框
- 为什么MFC中的模式对话框实际上是内部无模式的
- 当另一个窗口关闭时关闭无模式对话框
- 设计模式保存MFC对话框控件状态的步骤
- 如何在 WTL 中删除指向无模式对话框的指针
- 线程退出时 DLL 中的 MFC 无模式对话框被销毁
- Qt:关闭模式对话框关闭程序
- 如何在 QModelView 中组合模式对话框编辑器和就地小组件编辑器
- C++ 使用 WINAPI 启动多个无模式对话框(无 MFC)
- 模式对话框处于活动状态时隐藏MFC主窗口