Array
(
)

Executar aplicativo ou script externo

Dedi
   - 13 jan 2006

Amigos,
No delphi desenvolvi um aplicativo que atualiza o relogio um numero x por dia (atualiza via ntp com relogio atomico).
Agora tenho que fazer o mesmo para o linux já que a empresa possui servidores linux, A duvida é como executar um aplicativo externo no kylix, no meu caso penso em executar um o ´ntpdate host_do_servidor´


isso seria possivel como ?


Dopi
   - 13 jan 2006

Função extraida de ACBrUtil.pas do Projeto ACBr

#Código


{-----------------------------------------------------------------------------
- Executa programa Externo descrito em "Command", adcionando os Parametros
"Params" na linha de comando
- Se "Wait" for true para a execução da aplicação para esperar a conclusao do
programa externo executado por "Command"
- WindowState apenas é utilizado na plataforma Windows
---------------------------------------------------------------------------- }
procedure RunCommand(Command: String; Params: String; Wait : Boolean;
WindowState : Word);
var
{$ifdef MSWINDOWS}
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
Executed : Boolean ;
PCharStr : PChar ;
{$endif}
ConnectCommand : PChar;
begin
{$ifdef LINUX}
Command := Trim(Command + ´ ´ + Params) ;
if not Wait then
Command := Command + ´ &´ ; { & = Rodar em BackGround }
{$IFNDEF FPC}
ConnectCommand := PChar(Command);
Libc.system(ConnectCommand);
{$ELSE}
Shell(Command)
{$ENDIF}
{$endif}
{$ifdef MSWINDOWS}
Command := Trim(Command) ;
PCharStr := PChar(Trim(Params)) ;
if Length(PCharStr) = 0 then
PCharStr := nil ;

if not Wait then
ShellExecute(0,´open´,PChar(Command),PCharStr, nil, WindowState )
// winexec(ConnectCommand, WindowState)
else
begin
ConnectCommand := PChar(Trim(Command + ´ ´ + Params));
PCharStr := PChar(ExtractFilePath(Command)) ;
if Length(PCharStr) = 0 then
PCharStr := nil ;
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;

Executed := CreateProcess(nil, ConnectCommand, nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PCharStr, SUInfo, ProcInfo);

try
{ Aguarda até ser finalizado }
if Executed then
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
finally
{ Libera os Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
{$endif}
end;



Dedi
   - 17 jan 2006

Dopi,
apesar de saber que não há nada de errado na função que me passou,não consegui faze o comando funcionar,Creio ser algo referente as permissoes de usuarios.(não tenho grande experiencia com linux).

De qualquer modo Obrigado pela ajuda.


Dopi
   - 17 jan 2006

Não sei se é o caso, mas esqueci de mencionar que faltou o uses:

#Código

interface
Uses {$ifdef MSWINDOWS}
Windows, ShellAPI
{$else}
Libc
{$endif} ;



Dedi
   - 18 jan 2006


Citação:
Não sei se é o caso, mas esqueci de mencionar que faltou o uses:

Código:
interface
Uses {$ifdef MSWINDOWS}
Windows, ShellAPI
{$else}
Libc
{$endif} ;


Não é o caso,eu já havia dicionado ao use a ´Libc´.


Dopi
   - 18 jan 2006

Lembrei de mais um detalhe... A função RunCommand não funciona dentro da IDE do Kylix.... Mas quando vc roda o programa fora de IDE ela funciona...


Martins
   - 18 jan 2006


Citação:
Lembrei de mais um detalhe... A função RunCommand não funciona dentro da IDE do Kylix.... Mas quando vc roda o programa fora de IDE ela funciona...


Interessante isso, muit interessante mesmo, vc poderia me dizer pq isso acontece Daniel?

Pelo visto ainda existem alguns bravos guerreiros do Kylix.


Dopi
   - 26 jan 2006


Citação:

Interessante isso, muit interessante mesmo, vc poderia me dizer pq isso acontece Daniel?

Não sei bem ao certo Martins mas acho que deve estar relacionado ao uso do Debug integrado... Acho que se desabilitar ele a execução ocorre (mas não testei ainda)


Citação:

Pelo visto ainda existem alguns bravos guerreiros do Kylix.
Nem me fale... Cada vez me acho mais louco por ainda estar insistindo no Kylix, mas consegui me cercar de bons componentes e já estou tendo alguns resultados muito bons...

Afinal de contas até hoje eu ainda programa em Clipper (e xHarbour)... então linguagem morta é comigo mesmo :wink:
PS.: Desde que me tragam os resultados esperados e produtividade...

PS2.: Desculpas pela demora do reply.. estive fora por uns dias...