Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetExitCodeProcess не всегда отрабатывает


Автор: ZVano 31.3.2011, 16:36
Есть код, который запускает из одной программы (Прога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-файл из папки с распаковаными файлами.
Т.е. запускается командный интерпретатор со своим хендлом.


Вопрос: Как определить, что вся цепочка порожденных приложений завершена?



Автор: xvr 1.4.2011, 12:17
Цитата(ZVano @  31.3.2011,  16:36 Найти цитируемый пост)
Вопрос: Как определить, что вся цепочка порожденных приложений завершена?
Если стаб-распаковщик в exe после запуска bat файла сам завершается - то никак 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)