Я хочу, чтобы автоматическая проверка была плохой или хорошей для запуска моих файлов .exe. Например, для этих двоичных файлов у меня отсутствуют dll, и когда я использую CreateProcess, он не возвращает ошибку и предоставляет мне системное MessageBox («Dll отсутствует»). Если я закрою его вручную, методы вернут код выхода 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 , чтобы дочерний процесс наследовал режим ошибки родителя. Согласно docs, это «не отображает окно сообщения обработчика критических ошибок, вместо этого система отправляет ошибку вызывающему процессу».
При желании SetErrorMode(oldErrorMode);
после CreateProcess
, чтобы восстановить предыдущую настройку.