Executar aplicativo ou script externo

13/01/2006

0

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 ?


Dedi

Dedi

Responder

Posts

13/01/2006

Dopi

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

{-----------------------------------------------------------------------------
 - 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;



Responder

17/01/2006

Dedi

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.


Responder

17/01/2006

Dopi

Não sei se é o caso, mas esqueci de mencionar que faltou o [b:b6550fafda]uses[/b:b6550fafda]:

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



Responder

18/01/2006

Dedi

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´.


Responder

18/01/2006

Dopi

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...


Responder

18/01/2006

Martins

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.


Responder

26/01/2006

Dopi

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)

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...


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar