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

Поиск:

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


Эксперт
****


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

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



Код

var 
 pi : TProcessInformation;  
 
 si : TStartupInfo;  
 
  
begin 
 ZeroMemory(@si,sizeof(si));  
 
 si.cb:=SizeOf(si);  
 
 if not CreateProcess(  
 
  
 PChar(lpApplicationName), //pointer to name of executable module  
 
 PChar(lpCommandLine), // Command line.  
 
 nil, // Process handle not inheritable.  
 
 nil, // Thread handle not inheritable.  
 
 False, // Set handle inheritance to FALSE.  
 
 0, // No creation flags.  
 
 nil, // Use parent's environment block.  
 
 nil, // Use parent's starting directory.  
 
 si, // Pointer to STARTUPINFO structure.  
 
 pi ) // Pointer to PROCESS_INFORMATION structure.  
 
  
 then begin  
 
  
 Result:=false;  
 
 RaiseLastWin32Error;   
 
 Exit;  
 
  
 end;  
 
  
 WaitForSingleObject(pi.hProcess,INFINITE);  
 
 CloseHandle(pi.hProcess);  
 
 CloseHandle(pi.hThread);  
 
 // ... здесь твой код  
 
  
end; 


Автор ответа: TAPAKAH 

Примечание Vit: 

Если заменить 

Код

WaitForSingleObject(pi.hProcess,INFINITE);
 

на 

Код

while WaitforSingleObject(PI.hProcess,200)=WAIT_TIMEOUT do   application.ProcessMessages; 



то вызывающая программа не будет казаться завешанной и будет отвечать на сообщения 


Примечание Mikel: В RxLib есть функция для этого: FileExecuteWait 


Код

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;


--------------------------------------------------------------------------------

Автор: Fabrнcio Fadel Kammer 

Пример показывает как из Вашей программы запустить внешнее приложение и подождать его завершения. 

Код

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(SUInfo);  
    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;  



А вот пример вызова этой функции: 

Код

ExecAndWait( 'C:\windows\calc.exe', '', SH_SHOWNORMAL)  


Параметр FileName = Имя внешней программы. 
Параметр Params = Параметры, необходимые для запуска внешней программы 
Параметр WinState = Указывает - как будет показано окно: 
Для этого параметра мы можем так же использовать следующие константы: 
SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOWNORMAL


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0620 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


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

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