【问题标题】:How close message box after closing parent process opened using CreateProcess()关闭使用 CreateProcess() 打开的父进程后如何关闭消息框
【发布时间】:2020-12-21 06:34:38
【问题描述】:

我想自动检查运行我的 .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;
} 

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    CreateProcess之前调用UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);,并确保CREATE_DEFAULT_ERROR_MODEdwCreationFlags参数中没有设置,这样子进程继承父进程的错误模式。根据docs,这个“不显示关键错误处理程序消息框,而是系统将错误发送给调用进程”。

    CreateProcess 之后的可选SetErrorMode(oldErrorMode); 以恢复以前的设置。

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2018-08-17
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多