Caroso,
Cita:
Empezado por 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:
Código Delphi
[-]
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
public
end;
var
ClientCmd: TClientCmd;
implementation
{$R *.dfm}
procedure TClientCmd.FormCreate(Sender: TObject);
begin
ClientSocket1.Port := 23;
ClientSocket1.Host := '127.0.0.1'; 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:
Código Delphi
[-]
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
public
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/Delph...rverSocket.rar
Revisa estos links:
Espero sea útil
Nelson.