A ver... bueno acá esta. encontré una función que tengo desde hace rato ratón.
Te comento que WinExec no se recomienda usarla más. Al menos eso decen los de Microsoft. Sólo quedó por compatibilidad y en su lugar se puede usar CreateProcess o (como hago yo) ShellExecute/ShellExecuteEx.
El punto a tener en cuenta a tu problema es la función WaitForSingleObject.
Código Delphi
[-]
Uses
ShellApi;
procedure ShellExec(FileName: string; parameters: string; showmode: integer; wait: boolean);
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';
lpFile := PChar(FileName);
nShow := showmode;
lpParameters := pchar(parameters);
end;
if ShellExecuteEx(@exInfo) then
begin
Ph := exInfo.HProcess;
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
if wait then
begin
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
end;
CloseHandle(Ph);
end;
un ejemplo sería: ShellExec('cmd','', SW_NORMAL, true);
Si alguien se le ocurre alguna mejora, no duden en avisar así actualizo mi código.
Especialmente se puede implementar un TimeOut. Por ejemplo, la función tirar error y/o esperar la intervención del usuario y, por consiguiente, colgarse, esperando indefinidamente.
En caso de que se implemente un TimeOut, se puede tomar una acción como terminar el proceso creado o... qué se yo!
Recueda de poner el cursor en espera antes y restaurarlo después
Paso algunos links de interés
http://msdn.microsoft.com/en-us/libr...54(VS.85).aspx
http://msdn.microsoft.com/en-us/libr...84(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms682425.aspx
http://msdn.microsoft.com/en-us/library/ms687032.aspx
Seguro que están en castellano también...