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

C++ 线程退出时dll中的mfc无模式对话框被破坏,c++,dll,mfc,dialog,modeless,C++,Dll,Mfc,Dialog,Modeless,我想打开一个MFC无模式对话框,将MFC dll注入另一个进程,dll的任务是钩住winsock发送和接收,对话框将是与dll通信的接口。dll应该能够在对话框运行时运行钩子 BOOL CDriverApp::InitInstance() { CWinApp::InitInstance(); if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FAL

我想打开一个MFC无模式对话框,将MFC dll注入另一个进程,dll的任务是钩住winsock发送和接收,对话框将是与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; <--- 
}
我读过线程,但是我的
InitInstance()
从一开始就已经返回了
true
,所以这是一个不同的问题(我想)


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

这可能是您的问题:

常规DLL必须有一个CWinApp派生类和一个 该应用程序类,以及MFC应用程序。但是, DLL的CWinApp对象不具有主消息泵,与此相同 应用程序的CWinApp对象

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

)

编辑:

这显示了如何使用cWnd而不是CDialog执行您正在执行的操作。我个人认为这是一个更好的方式

下面是一个将消息挂钩附加到非模态的示例


这是否意味着对话框没有消息处理功能?因此,我必须添加一个导出函数,该函数调用CWinApp::PreTranslateMessage?正确,无模式对话框没有自己的消息处理程序。这个进程钩住主应用程序的消息循环。它说应用程序的主消息泵必须调用DLL导出的例程,这是指加载DLL的进程吗?如前所述,我将dll注入了一个无法控制的正在运行的进程中。您可能需要做几件事——在单独的线程上创建对话框,然后安装windows消息挂钩。我已经编辑了我的答案,其中的链接可能会有所帮助。我已经查看了你的第二个链接,并对此进行了一些研究。似乎不应该在InitInstance内创建第二个线程,因为它将崩溃。所以我必须从注入器创建螺纹,对吗?所以我想创建两个单独的dll,一个用于挂接winsock,另一个用于处理对话框。这就是你的意思吗?
The thread '_DllMainCRTStartup' (0x418) has exited with code 1657602048 (0x62cd0000).