处理已创建进程的

时间:2015-12-04 09:40:40

标签: c++ windows exception process

在我的项目中,我必须运行一个外部应用程序来为我做一些工作。

不幸的是,这个应用程序不是很稳定,当给定的输入不是这个应用程序所期望的时候它会崩溃。

我正在尽力确保所有输入都有效,但我也想处理那些没有预测的情况,而不是Windows AppCrash消息显示我自己的消息。

所以我的问题是:有没有办法处理AppCrash事件的过程?

以下是我用来启动应用的代码:

bool runExternalCalibrationConsole(const std::wstring &wsCalibFolderPath)
{
    wchar_t AppName[512];
    wchar_t CmdLine[2 * MAX_PATH];

    std::wstring app = L"D:\\ExternalCalibrationConsole.exe";
    std::wstring cmd = L"D:\\ExternalCalibrationConsole.exe";
    cmd += L" ";
    cmd += wsCalibFolderPath;
    swprintf_s(AppName, 512, app.c_str());
    swprintf_s(CmdLine, 512, cmd.c_str());
    PROCESS_INFORMATION processInformation;
    STARTUPINFO startupInfo;
    memset(&processInformation, 0, sizeof(processInformation));
    memset(&startupInfo, 0, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);

    BOOL result;
    char tempCmdLine[MAX_PATH * 2];  //Needed since CreateProcessW may change the contents of CmdLine
    if (CmdLine != NULL)
    {
        //_tcscpy_s(tempCmdLine, MAX_PATH * 2, CmdLine);
        result = ::CreateProcess(AppName, CmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation);
        if (result){
            printf("Process created\n");
        }
        else
        {
            printf("Error creating process\n");
            return -10;
        }
        WaitForSingleObject(processInformation.hProcess, INFINITE);
        DWORD exitCode;
        result = GetExitCodeProcess(processInformation.hProcess, &exitCode);

        CloseHandle(processInformation.hProcess);

        return exitCode;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

一种选择是将子进程创建为可调试(例如,将DEBUG_ONLY_THIS_PROCESS传递给CreateProcess()),然后在WaitForDebugEvent()ContinueDebugEvent()的帮助下处理它的调试事件

请参阅MSDN: WaitForDebugEventMSDN: Writing the Debugger's Main LoopAn example of setting that up