C++ 线程退出时dll中的mfc无模式对话框被破坏
我想打开一个MFC无模式对话框,将MFC dll注入另一个进程,dll的任务是钩住winsock发送和接收,对话框将是与dll通信的接口。dll应该能够在对话框运行时运行钩子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
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).