Avatar billede 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.
:-)
Avatar billede Slettet bruger
27. marts 2010 - 11:24 #1
Jeg bruger Delphi 7
:-)
Avatar billede arne_v Ekspert
27. marts 2010 - 15:33 #2
Lader din service lytte på en socket og når noget forbinder og sende en bestemt kommando så starter den app'en.
Avatar billede 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?
:-)
Avatar billede arne_v Ekspert
27. marts 2010 - 15:53 #4
TIdTCPServer

maa kunne bruges til server.
Avatar billede arne_v Ekspert
27. marts 2010 - 15:54 #5
Men jeg kan lige prøve og bixe lidt kode.
Avatar billede arne_v Ekspert
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..
Avatar billede 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 ****************************************************

:-)
Avatar billede arne_v Ekspert
29. marts 2010 - 00:14 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester