0

別のプロセスに挿入されたMFCdllから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ているので、別の問題です(私は思います)

だから、私の質問は、ダイアログが破壊されるのを防ぐ方法ですか?または、スレッドが終了しないようにしますか?または、モーダルダイアログで実行できますか?

4

1 に答える 1

1

これはあなたの問題かもしれません:

通常のDLLには、MFCアプリケーションと同様に、CWinAppから派生したクラスとそのアプリケーションクラスの単一のオブジェクトが必要です。ただし、DLLのCWinAppオブジェクトには、アプリケーションのCWinAppオブジェクトのように、メインメッセージポンプがありません。

アプリケーションがメインメッセージポンプを所有しているため、CWinApp::RunメカニズムはDLLには適用されないことに注意してください。DLLがモードレスダイアログを開くか、独自のメインフレームウィンドウがある場合、アプリケーションのメインメッセージポンプは、DLLによってエクスポートされたルーチンを呼び出す必要があります。このルーチンは、DLLのアプリケーションオブジェクトのCWinApp::PreTranslateMessageメンバー関数を呼び出します。

http://msdn.microsoft.com/en-US/library/f22wcbea(v=vs.80

編集:

これは、CDialogの代わりにcWndを使用して実行していることを実行する方法を示しています。個人的には、それがより良い方法だと思います。

http://codinganswer.com/c/cwnd-in-a-new-thread-in-a-dll.html

これは、モードレスにメッセージフックをアタッチする例です。

http://support.microsoft.com/kb/q187988/

于 2012-06-25T18:29:02.330 に答える