|
Вопрос # 4 609/ вопрос открыт / |
|
Здравствуйте! Мне нужно определить т.н. код возврата чужого приложения. Что требуется:
Необходимо запустить процесс, дождаться его завершения, и определить - если приложение было завершено с ошибкой, то выдавать, например, одно сообщение, если завершено правильно - другое...
Например, запускается инсталлятор: при выходе без установки надо показать соответствующее сообщение. Если установка была совершена - ничего не показываем. На деле приложение может быть любым, не только инсталлятором.
 |
Вопрос задал: 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™ (статус: Доктор наук), 26 сентября 2010, 20:38 [#2]:
Есть такая функция ExecAndWait()... Надо поискать, где она находится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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));
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|