Показать сообщение отдельно
  #4  
Старый 18.04.2014, 11:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от EviLrul
Хотелось бы Вас попросить прокоментить ваш код, хотелось бы лучше его понять...
Что именно в этом коде непонятно? Здесь центральное место это вызов API-функции CreateProcess, всё что до этого - подготовительные операции, то что после - завершающие операции. API-функция WaitForSingleObject ожидает сигнала, в данном случае бесконечно (INFINITE), в случае с хэндлом процесса сигналом является завершение приложения, т.е. эта функция в данном случае фактически "повесит" запускающее приложение пока не завершится запускаемое приложение.
По поводу функции WinExec - она очень древняя и ей лучше не пользоваться. Лучшая ей замена это CreateProcess или же менее предпочтительная ShellExecute.
Цитата:
Сообщение от EviLrul
и на разных ПК и разных ОС (winXP, win7), то стартует, то выдаёт по не понятной мне закономерности "CreateProcess failed" (я так понимаю что CreateProcess не отрабатывал в какие то моменты) может у меня всё же код кривой? поможите чем сможите...
Самого факта что процесс не был запущен не достаточно. В случае ошибки CreateProcess устанавливает так же и код ошибки который можно узнать API-функцией GetLastError и декодировать её в осмысленный текст API-функцией SysErrorMessage. Или же вместо этого можно просто вызвать исключение функцией RaiseLastOSError.
Цитата:
Сообщение от EviLrul
А так же интересно, почему не отрабатывает все же мой вариант, есть предположения?
Во-первых не указано расширение запускаемого файла - имя у этого файла скорее всего не просто "start", а "start.exe" - вот так и нужно указывать в WinExec.
Во-вторых возможно это файл не находится ни в одной из тех папок в которых WinExec может его найти, поэтому желательно указывать перед именем файла и полный путь к нему, или как минимум устанавливать соответствующую текущую директорию с помощью SetCurrentDir.
Ответить с цитированием