27. marts 2010 - 11:22Der 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?
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..
Synes godt om
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;
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 ****************************************************
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.