Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como Ejecuto una Apliacacion Externa (https://www.clubdelphi.com/foros/showthread.php?t=75831)

adls65 22-09-2011 03:29:43

Como Ejecuto una Apliacacion Externa
 
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.

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, utiliza los TAG's cuando escribas código delphi en los mensajes.


La franja horaria es GMT +2. Ahora son las 04:53:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi