Есть код, который запускает из одной программы (Прога1) другую (ПрогаX). Затем "Прога1" ждет завершения выполнения "ПрогаX".
Есть такая структурка:
Код | struct TProcessW { UnicodeString filePath; UnicodeString parameters;
STARTUPINFOW startupInfo; PROCESS_INFORMATION processInfo;
bool runResult; //Выполняет программу bool TProcessW::Run(void) { ZeroMemory(&startupInfo, sizeof(STARTUPINFOW)); // обнулить startupInfo.cb = sizeof(STARTUPINFOW); GetStartupInfoW(&startupInfo); UnicodeString runCommand = UnicodeString(filePath.Trim() + " " + parameters.TrimLeft()).Trim(); runResult = CreateProcessW( // NULL // , runCommand.w_str() // , NULL // , NULL// , false // , 0 // , 0 // , NULL , &startupInfo // , &processInfo // ) == true; return runResult; }
// Проверяет жив ли еще запущеный ранее процесс bool TProcessW::IsAlive(void) { DWORD exitCode = 0; if (!GetExitCodeProcess(processInfo.hProcess, &exitCode)) // if (!GetExitCodeThread(processInfo.hThread, &exitCode)) return false; return exitCode == STILL_ACTIVE; } };
|
Используем так:
Код | TProcessW process;
//process.filePath = "C:\\WINDOWS\\system32\\calc.exe";// 1. Это работает process.filePath = "C:\\Tests\\myArchive.exe";// 2. Это не работает //process.filePath = "C:\\WINDOWS\\explorer.exe";// 3.Это глючит (при 1м запуске работает, остальные запуски нет)
process.Run(); do { // Обновляем итерфейс Sleep(100); } while (process.IsAlive());
|
process.IsAlive() говорит, что процесса нет вживых. Не работает ни "GetExitCodeProcess", ни "GetExitCodeThread".
Изменено: Начинаю понимать. myArchive.exe - сапораспаковывающийся архив. После распаковки автоматически запускается .bat-файл из папки с распаковаными файлами. Т.е. запускается командный интерпретатор со своим хендлом.
Вопрос: Как определить, что вся цепочка порожденных приложений завершена?
|