PDA

Ver la Versión Completa : Enviar parametros de una aplicacion a otra en ejecucion


Caroso
23-08-2013, 02:07:16
Buenas noches amigos del foro... tengo una duda que seguro ustedes podrian solucionarme... alguno sabria como hacer para pasarle un parametro a un aplicacion que ya se encuentra en ejecucion?¿ por ejemplo.. tengo este codigo en el inicio de mi form:

procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
for i:= 0 to ParamCount do
Memo1.Lines.Append(ParamStr(i));
end;

mediante el acceso directo del .exe paso dos parametros que me los lista en el memo... el tema es que quiero enviar parametros no cuando arranca el programa si no cuando se esta ejecutando... :confused:

si no se entiende la idea la explayo un poco mas... muchas gracias a todos y que terminen lindo el dia :)

ecfisa
23-08-2013, 04:48:55
Hola Caroso.

Revisa si te sirven estos enlaces:

Lamar una aplicación y ejecutar acciones (http://www.clubdelphi.com/foros/showthread.php?t=81589)
que en lblmarquee se pueda copiar un renglon (http://www.clubdelphi.com/foros/showthread.php?t=69609)


Saludos :)

Caroso
23-08-2013, 05:11:24
muchas gracias ecfisa.. los revisare y te comento... saludos :)

nlsgarcia
23-08-2013, 11:27:56
Caroso,


...¿como hacer para pasarle un parámetro a un aplicación que ya se encuentra en ejecución?...

Una opción complementaria a lo sugerido en el Msg #2 es por medio de Sockets en Delphi.

Revisa este código:

unit UClient;

interface

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

type
TClientCmd = class(TForm)
Edit1: TEdit;
ClientSocket1: TClientSocket;
Button1: TButton;
Button2: TButton;
RadioGroup1: TRadioGroup;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure OnClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure OnError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Button2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ClientCmd: TClientCmd;

implementation

{$R *.dfm}

procedure TClientCmd.FormCreate(Sender: TObject);
begin
ClientSocket1.Port := 23;
ClientSocket1.Host := '127.0.0.1'; // IP Local, Cliente y Servidor residen en la misma máquina.
ClientSocket1.Active := true;
end;

procedure TClientCmd.OnClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Active := false;
end;

procedure TClientCmd.Button1Click(Sender: TObject);
begin
if ClientSocket1.Active then
ClientSocket1.Socket.SendText(Edit1.Text);
end;

procedure TClientCmd.OnError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
if ErrorCode = 10061 then
begin
raise Exception.Create('El Servidor No Esta Activo, Pulse "Open Socket" para Reintentar');
ClientSocket1.Close;
end;
ErrorCode := 0
end;

procedure TClientCmd.Button2Click(Sender: TObject);
begin
ClientSocket1.Open;
end;

procedure TClientCmd.RadioGroup1Click(Sender: TObject);
begin
Edit1.Text := RadioGroup1.Items.Strings[RadioGroup1.ItemIndex];
end;

end.

El código anterior envía por medio del componente TClientSocket un String (Parámetros, Comandos, Data) a una aplicación que funge como servidor y procesa la data recibida.

Revisa este código:

unit UServer;

interface

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

type
TServerCmd = class(TForm)
ServerSocket1: TServerSocket;
Memo1: TMemo;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure OnClose(Sender: TObject; var Action: TCloseAction);
procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ServerCmd: TServerCmd;

implementation

{$R *.dfm}

function StringToCaseSelect(Selector : String; CaseList: Array of String): Integer;
var
pos: integer;
begin
Result := -1;
for pos := 0 to Length(CaseList)-1 do
begin
if CompareText(Selector, CaseList[pos]) = 0 then
begin
Result := pos;
Break;
end;
end;
end;

procedure TServerCmd.FormCreate(Sender: TObject);
begin
ServerSocket1.Port := 23;
ServerSocket1.Active := True;
end;

procedure TServerCmd.OnClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Active := false;
end;

procedure TServerCmd.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
cmd : string;
begin
cmd := Socket.ReceiveText;
case StringToCaseSelect(cmd,['calc','notepad','paint','cmd','msg']) of
0 : ShellExecute(0, nil, 'calc.exe', nil, nil, SW_NORMAL);
1 : ShellExecute(0, nil, 'notepad.exe', nil, nil, SW_NORMAL);
2 : ShellExecute(0, nil, 'mspaint.exe', nil, nil, SW_NORMAL);
3 : ShellExecute(0, nil, 'cmd.exe', nil, nil, SW_NORMAL);
4 : MessageDlg('Msg', mtInformation, [mbOK], 0);
end;
Memo1.Lines.Add(cmd);
end;

end.

El código anterior recibe por medio del componente TServerSocket la data enviada por una aplicación cliente (Parámetros, Comandos, Data) y procesa la misma.

Los ejemplos están disponibles en el link: http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=ClientSocket+%26+ServerSocket.rar

Revisa estos links:

1- Exchanging Data over the Network using Delphi : http://delphi.about.com/od/networking/l/aa112602a.htm

2- TServerSocket and TClientSocket are Missing from Delphi 7 : http://edn.embarcadero.com/article/29768

3- Capitulo 10.2 Programando Sockets en Delphi : http://www.hackerdude.com/courses/delphi/Cap010.2.html

Espero sea útil :)

Nelson.

Caroso
26-08-2013, 19:30:51
Hola Caroso.

Revisa si te sirven estos enlaces:

Lamar una aplicación y ejecutar acciones (http://www.clubdelphi.com/foros/showthread.php?t=81589)
que en lblmarquee se pueda copiar un renglon (http://www.clubdelphi.com/foros/showthread.php?t=69609)


Saludos :)

Gracias por tu respuesta ecfisa... eh probado ambos codigos... me interesa el primero Lamar una aplicación y ejecutar acciones (http://www.clubdelphi.com/foros/showthread.php?t=81589)... lo descargue eh intente ejecutar... pero no pasaba nada... agrege un Showmessage al codigo receptor para investigar que era lo que sucedia... mediante el showmessage me di cuenta que lo que recibe el receptor es la cadena cortada... es decir en vez de recibir "Abrir" solo recibía "Abr", por lo cual no funcionaba...

ahora te pregunto si me podrias ayudar a solucionarlo... desde ya muchas gracias por tu tiempo... :)

Caroso
26-08-2013, 21:29:36
Ahi lo solucione muy facilmente muchas gracias a todos... saludos :)

ecfisa
26-08-2013, 21:31:58
Ahi lo solucione muy facilmente muchas gracias a todos... saludos :)
Me alegro :)

Ya había descargado los adjuntos para verificarlos, entonces los puedo borrar tranquilo...

Saludos :)