Я пишу код для восстановления резервных копий. Для этого я использую внешнюю программу. Пользователь может выбрать несколько файлов, и я буду выполнять внешнюю программу для каждого файла в цикле for
. Как приостановить мою программу до выхода внешней программы перед восстановлением следующего файла?Пауза программы до выхода внешней программы
2
A
ответ
0
Вот пример с использованием CreateProcess() и WaitForSingleObject()
procedure RunaAndWait(Command:String);
var
fStartupInfo: TStartupInfo;
fProcessInformation: TProcessInformation;
fProgram: String;
begin
fProgram := trim(Command);
FillChar(fStartupInfo, SizeOf(fStartupInfo), 0);
with fStartupInfo do
begin
cb := SizeOf(TStartupInfo);
wShowWindow := SW_HIDE;
end;
if CreateProcess(nil, pchar(fProgram), nil, nil, true, CREATE_NO_WINDOW,
nil, nil, fStartupInfo, fProcessInformation) then
begin
while WaitForSingleObject(fProcessInformation.hProcess, 10) > 0 do
begin
Application.ProcessMessages;
end;
CloseHandle(fProcessInformation.hProcess);
CloseHandle(fProcessInformation.hThread);
end
else
begin
RaiseLastOSError;
end;
end;
Использование:
procedure TForm1.Button1Click(Sender: TObject);
begin
RunaAndWait('notepad.exe');
Showmessage('Finished');
end;
+1
вот пример ['WaitForSingleObject'] (https://msdn.microsoft. com/en-us/library/windows/desktop/ms687032 (v = vs.85) .aspx), что неверно: D – fantaghirocco
+0
ProcessMessages является проблематичным. Почему вы это называете? –
Посмотрите на 'CreateProcess() и' WaitForSingleObject() '. 'CreateProcess()' возвращает дескриптор процесса, который вы можете подождать до тех пор, пока не будет завершен порожденный процесс. –
Или просто попробуйте найти http://stackoverflow.com/questions/26181231/execute-and-wait-not-working-sometimes – smooty86