Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запустить приложние и изнать как оно завершилось?? 
:(
    Опции темы
Nicholas
  Дата 5.1.2005, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Мне требуется следующее: Моя программа запускает внешний SFX-архив WinRar и ждет пока
архив распакуется, после завершения работы архива мне необходимо знать как он был завершен,
т.е. был ли он полностью распакован или в окне SFX-архива была нажата клавиша "Отмена" или
даны другие команды прерывающие его работу.

Если можно дайте рабочую процедурку.
smile

Затея возникла после того как поставил пару игр, в которых программы установки
запускает SFX-архив - ждет его завершения да еще умудряется записывать в лог все
распакованные из архива файлы!!!
PM MAIL ICQ   Вверх
Akella
Дата 5.1.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



задавай такие вопросы в теме "Системное программирование/WinAPI"

а тебе нужно исп. функцю типа WaitForSingleObject

Код

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;
var
 StartInfo: TStartupInfo;
 ProcInfo: TProcessInformation;
 CmdLine: ShortString;
begin
 { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
 CmdLine := '"' + Filename + '" ' + Params;
 FillChar(StartInfo, SizeOf(StartInfo), #0);
 with StartInfo do
 begin
   cb := SizeOf(StartInfo);
   dwFlags := STARTF_USESHOWWINDOW;
   wShowWindow := WinState;
 end;
 Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                         CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                         PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
 { Ожидаем завершения приложения }
 if Result then
 begin
   WaitForSingleObject(ProcInfo.hProcess, INFINITE);
   { Free the Handles }
   CloseHandle(ProcInfo.hProcess);
   CloseHandle(ProcInfo.hThread);
 end;
end;



А еще есть такие функции как
WaitForMultipleObjects
WaitForMultipleObjectsEx
PM MAIL   Вверх
Snowy
Дата 5.1.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



В инете и факах куча примеров на тему "Запуск программы и ожидание ее завершения". Поиск тебе в руки. Вопрос настолько затасканный, что повторяться не имеет смысла.
PM MAIL   Вверх
Alex
Дата 5.1.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162





--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
<Spawn>
Дата 5.1.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Помоему вы его немножко не поняли:

Цитата
мне необходимо знать как он был завершен,
т.е. был ли он полностью распакован или в окне SFX-архива была нажата клавиша "Отмена" или
даны другие команды прерывающие его работу.



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Alex
Дата 5.1.2005, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



Да нет, поняли мы его правильно:

Код

function FileExecuteWait(const FileName, Params, StartDir: string;
 InitialState: Word): Integer;
var
 Info: TShellExecuteInfo;
 ExitCode: DWORD;
begin
 FillChar(Info, SizeOf(Info), 0);
 Info.cbSize := SizeOf(TShellExecuteInfo);
 with Info do begin
   fMask := SEE_MASK_NOCLOSEPROCESS;
   Wnd := Application.Handle;
   lpFile := PChar(FileName);
   lpParameters := PChar(Params);
   lpDirectory := PChar(StartDir);
   nShow := InitialState;
 end;
 if ShellExecuteEx(@Info) then begin
   repeat
     Application.ProcessMessages;
     GetExitCodeProcess(Info.hProcess, ExitCode);
   until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
   Result := ExitCode;
 end
 else Result := -1;
end;


А если еще внимательно почитать описания к консольной версии WinRar, то можно найти такие строки:
Цитата
Коды возврата
~~~~~~~~~~~~~

    В случае успешного завершения операции RAR выходит с нулевым (0) кодом
    возврата. Если операция прервана из-за ошибки, то код возврата будет
    ненулевым. (Коды возврата можно, например, использовать в пакетных
    файлах с помощью переменной ERRORLEVEL.)

     255   ПРЕРВАНО         Операция была прервана пользователем.
           ПОЛЬЗОВАТЕЛЕМ

       9   ОШИБКА СОЗДАНИЯ  Ошибка при создании файла

       8   ОШИБКА ПАМЯТИ    Недостаточно памяти для выполнения операции.

       7   ОШИБКА           Ошибка при указании команды/параметра в
           ПОЛЬЗОВАТЕЛЯ     командной строке.

       6   ОШИБКА ОТКРЫТИЯ  Произошла ошибка открытия файла.

       5   ОШИБКА ЗАПИСИ    Произошла ошибка записи на диск.

       4   ЗАБЛОКИРОВАННЫЙ  Попытка изменения архива, заблокированного
           АРХИВ            ранее командой 'k' или ключом '-k'.

       3   ОШИБКА CRC       Во время распаковки обнаружена ошибка CRC.

       2   ФАТАЛЬНАЯ        Произошла критическая ошибка.
           ОШИБКА

       1   ПРЕДУПРЕЖДЕНИЕ   Произошла некритическая ошибка.

       0   УСПЕШНОЕ         Работа завершена без ошибок.
           ЗАВЕРШЕНИЕ


Приведенная мной функция взята из RxLib и в FAQ об этом сказано.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
<Spawn>
Дата 5.1.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Цитата
А если еще внимательно почитать описания к консольной версии WinRar, то можно найти такие строки: ...


Вот это уже другое дело. Я же имел ввиду то, что человеку не нужен код ожидания завершения стороннего процесса, так как у него это есть. Его же интересовала возможность узнать причину завершения, чего до этого поста не было сказано.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.