簡體   English   中英

關閉使用 CreateProcess() 打開的父進程后如何關閉消息框

[英]How close message box after closing parent process opened using CreateProcess()

我想自動檢查運行 my.exe 文件的好壞。 例如,對於這個二進制文件,我缺少 dll,當我使用 CreateProcess 時,它不會返回錯誤並為我提供系統 MessageBox(“Dll is missing”)。 如果我手動關閉它,方法會返回 exitCode STATUS_DLL_NOT_FOUND。 我希望從某個超時開始,所有系統消息框都將在關閉父進程的情況下關閉,並且我可以獲得我的 STATUS_DLL_NOT_FOUND。 我需要從我的代碼中完全自動工作。此代碼可以關閉打開的子對話框,但不能關閉消息框。

int main()
{
    HANDLE                               hJob;
    JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };
    PROCESS_INFORMATION                  pi = { 0 };
    STARTUPINFO                          si = { 0 };
    hJob = CreateJobObject(NULL, NULL);

    jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
    SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli));

    TCHAR szCmdline[] = TEXT(" -R:mm");
    si.cb = sizeof(si);
    CreateProcess(
        executableFiles[0].c_str(),
        szCmdline, 
        NULL, 
        NULL, 
        FALSE,
        CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB /*Important*/, 
        NULL, 
        NULL, 
        &si, 
        &pi);

    AssignProcessToJobObject(hJob, pi.hProcess); // Does not work if without CREATE_BREAKAWAY_FROM_JOB

    ResumeThread(pi.hThread);

    if (WaitForSingleObject(pi.hProcess, 3000) == WAIT_TIMEOUT)
    {
        EnumWindows(&SendWMCloseMsg, pi.dwProcessId);
        if (WaitForSingleObject(pi.hProcess, 2000) == WAIT_TIMEOUT)
        {

            TerminateProcess(pi.hProcess, 0);

            DWORD dwExitCode = 0;
            GetExitCodeProcess(pi.hProcess, &dwExitCode);

            const DWORD result = WaitForSingleObject(pi.hProcess, 2000);
            if (result == WAIT_OBJECT_0) 
            {
                if (dwExitCode == STATUS_DLL_NOT_FOUND)
                {
                    std::cout << "Dll is missing" << std::endl;
                }
            }
            else 
            {
                std::cout << "bad case" << std::endl;
            }
        }
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(hJob);
    return 0;
} 

調用UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); CreateProcess之前,並確保在dwCreationFlags參數中沒有設置CREATE_DEFAULT_ERROR_MODE ,以便子進程繼承父進程的錯誤模式。 根據文檔,這“不顯示關鍵錯誤處理程序消息框,而是系統將錯誤發送到調用進程”。

可選SetErrorMode(oldErrorMode); CreateProcess之后恢復之前的設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM