PDA

Ver la Versión Completa : Como Ejecuto una Apliacacion Externa


adls65
22-09-2011, 03:29:43
Hola, quisiera saber como puedo ejecutar una aplicacion (.EXE)
que esta dentro de una carpeta "X" (p.e. c:\apoyo\otrosistema.exe) desde mi programa en DELPHI 6.

Gracias.

dec
22-09-2011, 04:17:56
Hola,

Busca información de la función "ShellExecute" de la unidad "ShellApi". En estos mismos foros, por ejemplo, en este hilo (http://www.clubdelphi.com/foros/showthread.php?t=3123).

cubanbaker
22-09-2011, 06:33:48
Esto lo encontré hace algun tiempo, no se de donde, y funciona!
Prueba la explicación según lo que quieras hacer.

Utilizando WinExec:



WinExec(PChar('notepad.exe'),SW_SHOWNORMAL); {Ejecuta el Notepad.Exe}



Este ejemplo ejecutará el Block De Notas

El fichero a ejecutar debe estar dentro del PATH, o bien lo llamamos con la ruta completa:



WinExec(PChar('c:\windows\notepad.exe'),SW_SHOWNORMAL); {Ejecuta el Notepad.Exe}



Con WinExec, el programa Delphi no espera a que termine la ejecución de la aplicacion externa.


Si queremos que nuestra aplicacion Delphi espere hasta que la aplicación llamada haya terminado, podemos utilizar esta otra forma:



function TForm1.WinExecAndWait32(FileName:String; Visibility:integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
Resultado: DWord;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes}
nil, { pointer to thread security attributes}
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then Result := -1 { pointer to PROCESS_INF }

else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Resultado);
Result := Resultado;
end;
end;



Otra versión de la anterior, que ejecuta Applicacion.ProcessMessages para que no se muera tu form mientras espera:



function WinExecAndWait32(FileName:String; Visibility:integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
Resultado,exitCode: DWord;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes}
nil, { pointer to thread security attributes}
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo);

{Espera a que termine la ejecucion}
{Wait until execution finish}
repeat
exitCode := WaitForSingleObject( ProcessInfo.hProcess,1000);
Application.ProcessMessages;
until (exitCode <> WAIT_TIMEOUT);
GetExitCodeProcess(ProcessInfo.hProcess,Resultado);
MessageBeep(0);
CloseHandle(ProcessInfo.hProcess );
Result:=Resultado;
end;

cubanbaker
22-09-2011, 06:46:57
Si quieres obtener el directorio en curso, usa esto. En este caso se guarda el directorio actual en un label, pero lo puedes poner en una variable y luego usarlo como desees

procedure TForm1.Button7Click(Sender: TObject);
function GetCurrentDirectory: String;
var
nBufferLength : DWORD;
lpBuffer : PChar;
begin
nBufferLength := MAX_PATH + 1;
GetMem( lpBuffer, nBufferLength );
try
if Windows.GetCurrentDirectory( nBufferLength, lpBuffer ) > 0 then
Result := lpBuffer;
finally
FreeMem( lpBuffer );
end;
end;
begin
Label1.Caption:=GetCurrentDirectory;
end;

Y, como te dijo Dec


ShellExecute(Forma.Handle,nil,PChar(nombredeFile),'','',SW_SHOWNORMAL);

Neftali [Germán.Estévez]
22-09-2011, 09:41:29
Por favor cubanbaker (http://www.clubdelphi.com/foros/member.php?u=78435), utiliza los TAG's cuando escribas código delphi (http://tinyurl.com/y5ctbot) en los mensajes.