Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 609

/ вопрос открыт /

Здравствуйте! Мне нужно определить т.н. код возврата чужого приложения. Что требуется:

Необходимо запустить процесс, дождаться его завершения, и определить - если приложение было завершено с ошибкой, то выдавать, например, одно сообщение, если завершено правильно - другое...
Например, запускается инсталлятор: при выходе без установки надо показать соответствующее сообщение. Если установка была совершена - ничего не показываем. На деле приложение может быть любым, не только инсталлятором.

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  


anthonysoprano Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: anthonysoprano (статус: Посетитель)
Вопрос отправлен: 26 сентября 2010, 19:56
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, anthonysoprano!
Забудьте то, что написано в приложении ка кошмарный сон. Вы можете сами посмотреть справку MSDN относительно WinExec: http://msdn.microsoft.com/en-us/library/ms687393(VS.85).aspx
Дескриптор процесса этой функцией не возвращается. Запускайте процесс с помощью CreateProcess:

var
  si:StartupInfo;
  pi:TProcessInformation;
  s:PChar;
  code:Cardinal;
begin
  s:='..........';//имя запускаемого exe-файла
  with si do begin
    cb:=SizeOf(start);
    dwFlags:=startf_UseShowWindow;
    wShowWindow:=sw_ShowNormal;
  end;
  CreateProcess(s,nil,nil,nil,false,0,nil,nil,si,pi);
//в переменную pi после запуска помещается дескриптор процесса
  CloseHandle(pi.hThread);
//далее ждем завершения процесса:
  WaitForSingleObject(pi.hProcess,INFINITE);
//получаем код завершения:
  GetExitCodeProcess(pi.hProcess,code);
  CloseHandle(pi.hProcess);
//в пременной code содержится код завершения процесса
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 26 сентября 2010, 20:33
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 26 сентября 2010, 20:48; участников в обсуждении: 2.
Паровоз

Паровоз (статус: 10-ый класс), 26 сентября 2010, 20:37 [#1]:

Вместо cb:=SizeOf(start) нужно cb:=SizeOf(si)
min@y™

min@y™ (статус: Доктор наук), 26 сентября 2010, 20:38 [#2]:

Есть такая функция ExecAndWait()... Надо поискать, где она находится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 26 сентября 2010, 20:40 [#3]:

Пардон, это процедура, но при желании её можно подработать напильником.
procedure dwExecAndWait(const FileName, Params: String; const CmdShow: Integer);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    ExInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := CmdShow;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    dwProcessMessages;
  CloseHandle(Ph);
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 26 сентября 2010, 20:48 [#4]:

Да, забыл еще, что структуры si,di нужно обнулить:
ZeroMemory(@si,SizeOf(si));
ZeroMemory(@pi,SizeOf(pi));

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.02 сек.