线程退出时,dll中的mfc无模式对话框被破坏

时间:2012-06-25 16:59:49

标签: c++ dll mfc dialog modeless

我想从MFC dll注入另一个进程打开一个MFC无模式对话框,dll的工作是挂钩winsock发送& 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; <--- 
}

dlgCDriverApp

成员的对话框

根据我的观察,对话框被破坏,因为线程已经退出,并且删除了保存对话框的内存。

The thread '_DllMainCRTStartup' (0x418) has exited with code 1657602048 (0x62cd0000).

我已阅读MFC modeless dialog close immediately个帖子,但我的InitInstance()已从第一个位置返回true,所以这是一个不同的问题(我认为)

那么,我的问题是如何防止对话框被破坏?或者可能阻止线程退出?或者是否可以使用模态对话框?

1 个答案:

答案 0 :(得分:0)

这可能是你的问题:

  

常规DLL必须具有CWinApp派生类和单个对象   该应用程序类,以及MFC应用程序。然而   DLL的CWinApp对象没有主消息泵,也是如此   应用程序的CWinApp对象。

     

请注意CWinApp :: Run   机制不适用于DLL,因为应用程序拥有   主要消息泵。 如果DLL打开无模式对话框或有主   它自己的框架窗口,应用程序的主要消息泵必须调用   由DLL导出的例程,该例程又调用   CW的应用程序的CWinApp :: PreTranslateMessage成员函数   对象

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/