执行命令后服务停止

时间:2014-01-31 03:58:31

标签: delphi sockets service self

我正在用Delphi创建一个Windows服务应用程序,我遇到了一个大问题:

服务运行,通过Winsock连接到服务器。服务器,当客户端连接时将文本发送到客户端(服务),然后客户端读取并执行和操作。在此操作完成后,服务将停止..

我想要的是:即使客户端Winsock收到数据并进行操作,我也希望服务保持RUNNING和WINSOCK LISTENING。

我已经测试过,如果服务停止,客户端Winsock可以接收数据,但是不能。

这是我的SERVICE.pas代码:

unit WebLauncher;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ScktComp, Registry, ShellApi, DSiWin32;

type
  TiGunBoundWebLauncher = class(TService)
    WebLauncherConector: TClientSocket;
    procedure ServiceExecute(Sender: TService);
    procedure WebLauncherConectorError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure WebLauncherConectorRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  iGunBoundWebLauncher: TiGunBoundWebLauncher;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  iGunBoundWebLauncher.Controller(CtrlCode);
end;

function TiGunBoundWebLauncher.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TiGunBoundWebLauncher.ServiceExecute(Sender: TService);
begin
   WebLauncherConector.Active := True;
    ServiceThread.ProcessRequests(False);
end;

procedure TiGunBoundWebLauncher.WebLauncherConectorError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
  var error: integer;
begin

   error := ErrorCode; {prevent exception from being thrown}
   ErrorCode := 0;

   if error = 10053 then begin
   end;

end;

procedure TiGunBoundWebLauncher.WebLauncherConectorRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  Data: string;
  GunBoundPath: string;
  handle: HWND;
begin

   Data := Socket.ReceiveText;

   If Pos('Launch', Data) > 0 then begin

        GunBoundPath := DSiReadRegistry('\Software\IGunBound\Seasson2',
  'Location', '', HKEY_LOCAL_MACHINE, KEY_QUERY_VALUE OR KEY_WOW64_64KEY);
        ShellExecute(handle,'open',PChar(GunBoundPath + '\Launcher.exe'), '', PChar(GunBoundPath), SW_SHOWNORMAL);

   end;

end;

end.

1 个答案:

答案 0 :(得分:1)

  

服务在执行Launcher.exe后立即停止。

这可能是问题的症结所在。很可能Launcher.exe是一个交互式程序,无法在会话运行的非交互式会话0中显示。也许您希望新流程能够出现在交互式桌面上(它不会出现)。

我认为,一旦您接受服务无法启动GUI的事实,您就需要完全重新考虑您的设计。

请注意,有一些方法可以让服务在交互式桌面上启动应用程序(http://msdn.microsoft.com/en-us/magazine/cc163486.aspx),但我不能诚实地推荐它们。