【问题标题】:mfc modeless dialog in dll destroyed when thread exit线程退出时,dll中的mfc无模式对话框被破坏
【发布时间】:2012-06-25 16:59:49
【问题描述】:

我想从注入另一个进程的 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 modeless dialog close immediately 线程,但我的InitInstance() 已经从一开始就返回了true,所以这是一个不同的问题(我认为)

那么,我的问题是如何防止对话框被破坏?或者也许阻止线程退出?还是可以通过模态对话框实现?

【问题讨论】:

    标签: c++ dll mfc dialog modeless


    【解决方案1】:

    这可能是你的问题:

    常规 DLL 必须有一个 CWinApp 派生类和一个 该应用程序类,就像 MFC 应用程序一样。然而 DLL 的 CWinApp 对象没有主消息泵,如 应用程序的 CWinApp 对象。

    注意 CWinApp::Run 机制不适用于 DLL,因为应用程序拥有 主信息泵。 如果 DLL 打开无模式对话框或具有主 它自己的框架窗口,应用程序的主消息泵必须调用 由 DLL 导出的例程,该例程又调用 DLL 应用程序的 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/

    【讨论】:

    • 这是否意味着对话框没有消息处理?所以我必须添加一个调用 CWinApp::PreTranslateMessage 的导出函数?
    • 正确的无模式对话框没有自己的消息处理程序。这个过程挂钩到主应用程序的消息循环中。
    • 上面写着the application's main message pump must call a routine exported by the DLL,是指加载dll的进程吗?如前所述,我将 dll 注入到我无法控制的正在运行的进程中。
    • 您可能应该做的几件事 - 在单独的线程上创建对话框,然后安装 Windows 消息挂钩。我已经用可能有帮助的链接编辑了我的答案。
    • 我查看了您的第二个链接,并且对此进行了一些研究。似乎不应在 InitInstance 中创建第二个线程,因为它会崩溃。所以我必须从注射器创建线程对吗?所以我正在考虑创建2个单独的dll,1个用于挂钩winsock,另一个用于处理对话框。这是你的意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多