Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Executar Programa Externo com Parametros


robinhocne

Pergunta

Boa tarde,

 

  Eu tenho um aplicativo  A que irá chamar outro aplicativo meu B, todos em delphi....

  Quando o aplicativo A chamar o B eu preciso passar um parametro (String) para o parametro B e quando o parametro B abrir ele já pegar esse Parametro.

  tem como ? por parametro ?

 

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

consegui montar, executando pelo cmd está funcionando, mas quando vou chamar e passar o parametro não tá indo....fiz assim no programa A:

dessa maneira funciona, mas eu preciso pegar esse valor "5" e passar como parametro, pois vou percorrer um query

  WinExec(PAnsiChar('E:\Projetos\Teste\Win32\Debug\B.exe "5"'), SW_SHOWNORMAL);

  dessa maneira ele nem abre....

nrProcesso := '5';
WinExec(PAnsiChar('E:\Projetos\teste\Win32\Debug\B.exe "'+nrProcesso+'"'), SW_SHOWNORMAL);


 

Link para o comentário
Compartilhar em outros sites

  • 0

tem sim...

para exemplificar de maneira bem simples como funciona ....

cria uma aplicação ( A ) que vai chamar a aplicação ( B ) passando parametros

exemplo:  vamos chamar e passar 3 parametros para a aplicação ( B )

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   WinExec(pchar('C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe '+
   'TESTE-' + 'PARAMETROS'),SW_NORMAL);
end;

end.

a aplicação ( B ) vai receber os parametros da aplicação ( A ) e mostrar em um memo

assim que ela for executada.

unit UTesteParametro;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   Memo1.Lines.APPEND(ParamStr(0)); // recebe o 1º parametro ( comando )
   Memo1.Lines.APPEND(ParamStr(1)); // recebe o 2º parametro
   Memo1.Lines.APPEND(ParamStr(2)); // recebe o 3º parametro
end;

end.

resultado

Memo1
C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe
TESTE-PARAMETROS

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
14 minutos atrás, Jhonas disse:

tem sim...

para exemplificar de maneira bem simples como funciona ....

cria uma aplicação ( A ) que vai chamar a aplicação ( B ) passando parametros

exemplo:  vamos chamar e passar 3 parametros para a aplicação ( B )


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   WinExec(pchar('C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe '+
   'TESTE-' + 'PARAMETROS'),SW_NORMAL);
end;

end.

a aplicação ( B ) vai receber os parametros da aplicação ( A ) e mostrar em um memo

assim que ela for executada.


unit UTesteParametro;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   Memo1.Lines.APPEND(ParamStr(0)); // recebe o 1º parametro ( comando )
   Memo1.Lines.APPEND(ParamStr(1)); // recebe o 2º parametro
   Memo1.Lines.APPEND(ParamStr(2)); // recebe o 3º parametro
end;

end.

resultado


Memo1
C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe
TESTE-PARAMETROS

abraço

saquei, mas estou tetando passar o parametro como variavel e ai ele não abre nada....

Link para o comentário
Compartilhar em outros sites

  • 0
4 minutos atrás, Jhonas disse:

nrProcesso := '5';
WinExec(PAnsiChar('E:\Projetos\teste\Win32\Debug\B.exe '+nrProcesso), SW_SHOWNORMAL);

é só fazer essa mudança.

abraço

não executa também. 

pesquisando na internet, achei essa função;

 

function TFuncoes.RunProcess(FileName: string; Params: string): Boolean; 
var 
  StartInfo: TStartupInfo; 
  ProcInfo: TProcessInformation; 
  Done: Boolean; 
begin 
  FillChar(StartInfo,SizeOf(TStartupInfo),#0); 
  FillChar(ProcInfo,SizeOf(TProcessInformation),#0); 
  StartInfo.cb := SizeOf(TStartupInfo); 
  try 
    {$IFDEF UNICODE} 
    if StringRefCount(FileName) = -1 then begin 
      FileName := Copy(FileName, 1, MaxInt); 
    end; 
    {$ENDIF UNICODE} 

    Done := CreateProcess(nil, PChar(FileName + ' ' + Params), nil, nil,False, 
                          CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, 
                          nil, nil, StartInfo, ProcInfo); 
    Result := Done; 
  finally 
    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
  end; 
end; 

e executando assim :

 

Executa('E:\Projetos\teste\Win32\Debug\B.exe '+nrProcesso,SW_SHOWNORMAL);

ele funciona, mas não consigo executa vários ao mesmo tempo, tenho que fechar para abrir o proximo.

Link para o comentário
Compartilhar em outros sites

  • 0

substituí para voce ver o resultado no exemplo que passei

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var  nrProcesso : string;
begin
   //WinExec(pchar('C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe '+
   //'TESTE-' + 'PARAMETROS'),SW_NORMAL);

   nrProcesso := '5';

   WinExec(pchar('C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe '+
   nrProcesso),SW_NORMAL);

end;

end.

resultado

Memo1
C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe
5

abraço

mas não consigo executa vários ao mesmo tempo, tenho que fechar para abrir o proximo.

varios ao mesmo tempo ????   extamente o que ?

voce quer passar varios parametros ?

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas usando assim : 

   nrProcesso := '5';

   WinExec(PChar('E:\Projetos\teste\Win32\Debug\B.exe '+nrProcesso),SW_NORMAL);

eu tenho erro 

[dcc32 Error] fA.pas(88): E2010 Incompatible types: 'PAnsiChar' and 'PWideChar'

mudando para PAnsiChar não dá erro, mas não executa, estou com o delphi Berlin, será que é por isso ?

Link para o comentário
Compartilhar em outros sites

  • 0

a sua variavel nrProcesso é um PWideChar ?  ela tem que ser string.

outra coisa... voce reparou nesse comando ?

Memo1.Lines.APPEND(ParamStr(0));

é ele que faz a diferença ... voce esta usando ele na outra aplicação ?

estou usando o delphi 7, como não conheço o delphi berlin não sei te dizer

 

Link para o comentário
Compartilhar em outros sites

  • 0

ela é String....

Executando esse comando no delphi 7 ele roda:

 


procedure TForm1.Button1Click(Sender: TObject);
var nrProcesso :String;
  i : integer;
begin


  for i := 0 to 2 do
    begin
      nrProcesso := '5';
      WinExec(pchar('E:\Robinho\Teste\B.exe '+
      nrProcesso),SW_NORMAL);
    end;

end;

Exectuando esse comando no delphi Berlin ele dá erro de 

[dcc32 Error] Unit3.pas(35): E2010 Incompatible types: 'PAnsiChar' and 'PWideChar'

Mas o nrProcesso é String e mudando para PAnsiChar....ele não roda....

ixi, como roda no Berlin... :(

 

Opa.... \o/

assim funcionou...

 

WinExec(PAnsiChar(AnsiString('E:\Robinho\Teste\B.exe '+nrProcesso)),SW_NORMAL);

 

Link para o comentário
Compartilhar em outros sites

  • 0

veja esse exemplo de tipos incompativeis

procedure TForm1.Button1Click(Sender: TObject);
var  nrProcesso, s: string;
begin
   nrProcesso := '5';

   s := 'C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe '+
   nrProcesso;

   WinExec(s,SW_NORMAL);
end;

vai dar erro de tipos incompativeis String and PAnsiChar

veja que o erro esta no comando Winexec ... ou seja o Winexec quer um PAnsiChar

e coloquei uma string ( S )

agora colocando o que o comando Winexec quer:

procedure TForm1.Button1Click(Sender: TObject);
var  nrProcesso, s: string;
begin
   nrProcesso := '5';

   s := 'C:\Arquivos de programas\Borland\Delphi7\Bin\PTesteParamentro.exe '+
   nrProcesso;

   WinExec(PAnsiChar(s),SW_NORMAL);
end;

observe que já não ocorre mais o erro e ele executa corretamente, pois houve a conversão de tipos.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
11 minutos atrás, robinhocne disse:

Opa.... \o/

assim funcionou...

 


WinExec(PAnsiChar(AnsiString('E:\Robinho\Teste\B.exe '+nrProcesso)),SW_NORMAL);

Vlw Jhonas, mas fazendo do jeito que você passou no delphi 7 funciona e no Berlin não, mas desse jeito ai de cima funcionou...

Link para o comentário
Compartilhar em outros sites

  • 0

lembro que houve uma modificação com relação ao PAnsiChar  a partir do dephi 2009

que acho que faz parte tambem do delphi berlin

function StringToPAnsiChar(stringVar : string) : PAnsiChar;
Var
  AnsString : AnsiString;
  InternalError : Boolean;
begin
  InternalError := false;
  Result := '';
  try
    if stringVar <> '' Then
    begin
       AnsString := AnsiString(StringVar);
       Result := PAnsiChar(PAnsiString(AnsString));
    end;
  Except
    InternalError := true;
  end;
  if InternalError or (String(Result) <> stringVar) then
  begin
    Raise Exception.Create('Conversion from string to PAnsiChar failed!');
  end;
end;

Bom, funcionando é o que interessa.

abraço

   
Link para o comentário
Compartilhar em outros sites

  • 0
48 minutos atrás, Jhonas disse:

lembro que houve uma modificação com relação ao PAnsiChar  a partir do dephi 2009

que acho que faz parte tambem do delphi berlin


function StringToPAnsiChar(stringVar : string) : PAnsiChar;
Var
  AnsString : AnsiString;
  InternalError : Boolean;
begin
  InternalError := false;
  Result := '';
  try
    if stringVar <> '' Then
    begin
       AnsString := AnsiString(StringVar);
       Result := PAnsiChar(PAnsiString(AnsString));
    end;
  Except
    InternalError := true;
  end;
  if InternalError or (String(Result) <> stringVar) then
  begin
    Raise Exception.Create('Conversion from string to PAnsiChar failed!');
  end;
end;

Bom, funcionando é o que interessa.

abraço

   

hum.....

Com certeza....vlw Jhonas.

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...