Hola yo utilizo la siguiente funcion para llamar a un programa externo y esperar hasta que termine.
Código:
function WinExecAndWaitEx(FileName: TFileName; TimeOut: DWORD): Boolean;
var
{$IFDEF WIN32}
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
ExCode,Res : DWORD;
{$ELSE}
hAppInstance: THandle;
Msg : TMsg;
aBuf : array[0..255] of Char;
{$ENDIF}
begin
Result := False;
{$IFNDEF WIN32}
hAppInstance := WinExec(StrPCopy(aBuf, FileName), SW_NORMAL);
if (hAppInstance < HINSTANCE_ERROR) then exit
else
repeat
while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
until (GetModuleUsage(hAppInstance) = 0);
Result := True;
{$ELSE}
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
with StartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_NORMAL;
end;
if CreateProcess(nil,PChar(FileName),nil,nil,False,NORMAL_PRIORITY_CLASS,
nil,nil,StartupInfo,ProcessInfo) then
begin
Res := WaitforSingleObject(ProcessInfo.hProcess, TIMEOUT);
if (Res = WAIT_TIMEOUT) then
begin
TerminateProcess(ProcessInfo.hProcess,0);
CloseHandle(ProcessInfo.hProcess);
Result := False;
end
else
begin
GetExitCodeProcess(ProcessInfo.hProcess, ExCode);
CloseHandle(ProcessInfo.hProcess);
Result := True;
end;
end;
{$ENDIF}
end;
La llamo asi:
Código:
Result := WinExecAndWaitEx(FileName,INFINITE);
Bueno espero que te sirva.
Saludos
Fernando