[英]CreateProcess such that child process is killed when parent is killed?
[英]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.