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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 666

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

Здравствуйте, уважаемые эксперты!

Каким образом узнать завершилось ли другое приложение, которое я запускаю через WinExec?

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

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 24 июня 2007, 18:47
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Emfs!
Код в приложении:
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);

лучше написать:

while WaitforSingleObject(ProcessInfo.hProcess,200)=WAIT_TIMEOUT do
Repaint;

Приложение:
  1. function WinExecAndWait32(FileName: string; Visibility: integer): integer;
  2. var
  3. zAppName: array[0..512] of char;
  4. zCurDir: array[0..255] of char;
  5. WorkDir: string;
  6. StartupInfo: TStartupInfo;
  7. ProcessInfo: TProcessInformation;
  8. begin
  9. StrPCopy(zAppName, FileName);
  10. GetDir(0, WorkDir);
  11. StrPCopy(zCurDir, WorkDir);
  12. FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  13. StartupInfo.cb := Sizeof(StartupInfo);
  14.  
  15. StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  16. StartupInfo.wShowWindow := Visibility;
  17. if not CreateProcess(nil,
  18.  
  19.  
  20.  
  21.  
  22.  
  23. NORMAL_PRIORITY_CLASS,
  24.  
  25.  
  26.  
  27. ProcessInfo) then
  28.  
  29.  
  30. else
  31. begin
  32. WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
  33. GetExitCodeProcess(ProcessInfo.hProcess, Result);
  34. end;
  35. end;
  36.  
  37.  


Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 24 июня 2007, 19:08
Оценка за ответ: 5


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

Всего сообщений: 4; последнее сообщение — 25 июня 2007, 06:41; участников в обсуждении: 2.
Фамилия Имя Отчество

Фамилия Имя Отчество (статус: Посетитель), 24 июня 2007, 19:20 [#1]:

Добавление
этой функции выдает ошибку при компиляции:

на строчке
GetExitCodeProcess(ProcessInfo.hProcess, Result);

ошибка:
types of actual and format var parameters must be identical
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 24 июня 2007, 19:46 [#2]:

Попробуйте это, а я разберусь с ошибкой:
uses Wintypes, WinProcs, Toolhelp, Classes, Forms;

function WinExecAndWait(Path: string; Visibility: word): word;
var
InstanceID: THandle;
PathLen: integer;
begin
{ Преобразуем строку в тип PChar }

PathLen := Length(Path);
Move(Path[1], Path[0], PathLen);
Path[PathLen] := #00;
{ Пытаемся запустить приложение }

InstanceID := WinExec(@Path, Visibility);
if InstanceID < 32 then { значение меньше 32 указывает на ошибку приложения }
WinExecAndWait := InstanceID

else
begin
repeat
Application.ProcessMessages;
until Application.Terminated or (GetModuleUsage(InstanceID) = 0);
WinExecAndWait := 32;
end;
end;
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 24 июня 2007, 21:38 [#3]:

Исправьте:
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
ExitCode: DWORD;

........
else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
end;
Фамилия Имя Отчество

Фамилия Имя Отчество (статус: Посетитель), 25 июня 2007, 06:41 [#4]:

Спасибо, оценку отправил.

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

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