Slettet bruger
27. marts 2010 - 11:22
Der er
7 kommentarer og
1 løsning
Starte program på remote server.
Jeg har et program der synkroniserer data mellem en Paradox database og en SQL server database. Programmet ligger på en Windows 2003 server.
Jeg ønsker at starte programmet fra en anden computer på netværket.
Jeg forestiller mig:
En service application, på serveren, der kan starte mit program.
En application på client computeren, der kan sende en kommando til servicen, på serveren, der så starter programmet.
Jeg kan godt lave en service application. Men hvordan sender jeg en kommando til den, fra en anden computer?
Meget gerne code eksempler.
:-)
Slettet bruger
27. marts 2010 - 15:45
#3
Der er jeg helt på bar bund. Har forsøgt mig med Indy 10, men er ikke nået ret langt.
Har du lidt code, client og server, der kan hjælpe mig igang?
:-)
28. marts 2010 - 16:43
#6
Jeg er ikke nogen ørn til Indy og Delphi men følgende synes at virke:
program executor;
{$APPTYPE CONSOLE}
uses
SysUtils,
ShellApi,
Windows,
IdTCPServer,
IdContext,
IdGlobal;
type
THandler = class
public
procedure Exec(AContext : TIdContext);
end;
procedure THandler.Exec(AContext : TIdContext);
var
cmd : string;
begin
if AContext.Connection.Socket.Readable then begin
cmd := AContext.Connection.IOHandler.ReadLn;
ShellExecute(0, 'open', PChar(cmd), nil, nil, SW_SHOWNORMAL) ;
end;
end;
var
srv : TIdTCPServer;
h : THandler;
begin
srv := TIdTCPServer.Create;
h := THandler.Create;
with srv.Bindings.Add do begin
IP := '127.0.0.1';
Port := 1234;
end;
srv.OnExecute := h.Exec;
srv.Active := true;
readln;
h.Destroy;
srv.Destroy;
end.
hvis jeg telnetter til localhost port 1234 og skriver:
notepad<retur>
så åbner den notepad.
O.s.v..
Slettet bruger
28. marts 2010 - 17:42
#7
Hej arne_v
Mange tak for din hjælp. Læg et svar så får du point.
I mellemtiden har jeg fundet frem til denne code, det ser ud til at virke.
Client Start ***************************************************
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
StdCtrls, IdAntiFreezeBase, IdAntiFreeze;
type
TForm1 = class(TForm)
IdTCPClient1: TIdTCPClient;
ButtonSend: TButton;
Memo1: TMemo;
IdAntiFreeze1: TIdAntiFreeze;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ButtonSendClick(Sender: TObject);
procedure IdTCPClient1Disconnected(Sender: TObject);
procedure IdTCPClient1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Request: TStringList;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Connect;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IdTCPClient1.Disconnect;
end;
procedure TForm1.ButtonSendClick(Sender: TObject);
Var
Response: String;
begin
Request.Clear;
Request.Add('VAR2SP');
Request.Add('Parameter');
Try
IdTCPClient1.Connect;
Try
IdTCPClient1.IOHandler.Write(Request);
Response:= IdTCPClient1.IOHandler.ReadLn;
If Response = 'Ok' Then
Memo1.Lines.Add('Ok')
Else
Memo1.Lines.Add('Fejl');
Finally
IdTCPClient1.Disconnect;
End;
Except
ShowMessage('Kan ikke starte: ' + Request[0]);
End;
end;
procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
Memo1.Lines.Add('Disconnected');
end;
procedure TForm1.IdTCPClient1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String);
begin
Memo1.Lines.Add(AStatusText);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Request:= TStringList.Create;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Request.Free;
end;
end.
Client Slut ****************************************************
Server Start ***************************************************
unit Service;
interface
uses
IdContext,
ShellApi,
IniFiles,
Windows, SysUtils, Classes, SvcMgr, Registry,
IdBaseComponent, IdComponent,
IdCustomTCPServer, IdTCPServer;
type
TInit = Record
IP: String;
Port: Integer;
VAR2SP: String;
Path: String;
End;
TSP2ADMService = class(TService)
TCPServer: TIdTCPServer;
procedure ServiceExecute(Sender: TService);
procedure ServiceAfterInstall(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure TCPServerExecute(AContext: TIdContext);
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
Function StartVAR2SP(User: String): Boolean;
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
private
public
function GetServiceController: TServiceController; override;
end;
Var
SP2ADMService: TSP2ADMService;
Request: TStringList;
Init: TInit;
implementation
{$R *.DFM}
Function TSP2ADMService.StartVAR2SP(User: String): Boolean;
Var
H: THandle;
Begin
Result:= (ShellExecute(H, 'Open', PChar(Init.VAR2SP), PChar(User), PChar(Init.Path), SW_HIDE) > 32);
End;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
SP2ADMService.Controller(CtrlCode);
end;
function TSP2ADMService.GetServiceController: TServiceController;
begin
Result:= ServiceController;
end;
procedure TSP2ADMService.ServiceExecute(Sender: TService);
begin
While Not Terminated Do
ServiceThread.ProcessRequests(True);
end;
procedure TSP2ADMService.TCPServerExecute(AContext: TIdContext);
begin
AContext.Connection.IOHandler.ReadStrings(Request, 2);
If Request[0] = 'VAR2SP' Then
Begin
If StartVAR2SP(Request[1]) Then
Begin
AContext.Connection.IOHandler.WriteLn('Ok');
AContext.Connection.Disconnect;
End
Else
Begin
AContext.Connection.IOHandler.WriteLn('Fejl');
AContext.Connection.Disconnect;
End;
End;
end;
procedure TSP2ADMService.ServiceAfterInstall(Sender: TService);
begin
With TRegistry.Create Do
Try
RootKey:= HKEY_LOCAL_MACHINE;
If OpenKey('SYSTEM\CurrentControlSet\Services\' + Name, True) Then
WriteString('Description', 'Admiral-Simplanner-Integration. Copyright (C) Boesgård Data ApS');
Finally
Free;
End;
end;
procedure TSP2ADMService.ServiceStart(Sender: TService; var Started: Boolean);
begin
With TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')) Do
Begin
Init.IP:= ReadString('TCP', 'IP', '0.0.0.0');
Init.Port:= ReadInteger('TCP', 'Port', 23);
Init.VAR2SP:= ReadString('PROGRAM', 'VAR2SP', '');
Init.Path:= ReadString('PROGRAM', 'Path', '');
Free;
End;
With TCPServer.Bindings.Add Do
Begin
IP:= Init.IP;
Port:= Init.Port;
End;
TCPServer.Active:= True;
end;
procedure TSP2ADMService.ServiceCreate(Sender: TObject);
begin
Request:= TStringList.Create;
end;
procedure TSP2ADMService.ServiceDestroy(Sender: TObject);
begin
Request.Free;
end;
procedure TSP2ADMService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
TCPServer.Active:= False;
end;
procedure TSP2ADMService.ServicePause(Sender: TService; var Paused: Boolean);
begin
TCPServer.Active:= False;
end;
procedure TSP2ADMService.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
TCPServer.Active:= True;
end;
end.
Server Slut ****************************************************
:-)