线程退出时 DLL 中的 MFC 无模式对话框被销毁

mfc modeless dialog in dll destroyed when thread exit

本文关键字:对话框 模式 MFC 退出 DLL 中的 线程      更新时间:2023-10-16

我想从注入到另一个进程的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/