robinhocne Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 nrProcesso := '5'; WinExec(PAnsiChar('E:\Projetos\teste\Win32\Debug\B.exe '+nrProcesso), SW_SHOWNORMAL); é só fazer essa mudança. abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 16, 2017 Denunciar Share Postado Maio 16, 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 robinhocne Postado Maio 16, 2017 Autor Denunciar Share Postado Maio 16, 2017 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
robinhocne
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
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.