我编写的一个用IdTCPClient编的一个service,是用来文件传输的,编译的时候通过了,用install加栽也没有问题,服务列表内也有我编的服务了,但当我启动时,系统提示“服务并未返回错误。着可能是一个windows内部错误或服务内部错误”
我的服务程序原代码如下::
unit mycs;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,math;type
  TclientService1 = class(TService)
    IdTCPClient1: TIdTCPClient;
    SaveDialog1: TSaveDialog;
    procedure clientexecute(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;var
  clientService1: TclientService1;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  clientService1.Controller(CtrlCode);
end;function TclientService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;procedure TclientService1.clientexecute(Sender: TService);
var
  cmd: string;
  ASize, TotalSize: Int64;
  AFileStream: TFileStream;
begin
  IdTCPClient1.Host := '127.0.0.1';
  IdTCPClient1.Port := 9925;
  IdTCPClient1.Connect;
   if not SaveDialog1.Execute then
  try
    IdTCPClient1.WriteLn('BEGIN');
    cmd := IdTCPClient1.ReadLn;
    SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));    begin
      IdTCPClient1.WriteLn('CANCEL');
      IdTCPClient1.Disconnect;
      exit;
    end;
    TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1));
    AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
    while Not Terminated do
    begin
    try
      repeat
        IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));
        ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);
        IdTCPClient1.ReadStream(AFileStream, ASize);
      until AFileStream.Size = TotalSize;    finally
      AFileStream.Free;
    end;
    IdTCPClient1.WriteLn('END');
  end;
  except
    showmessage('error');
  end;
  IdTCPClient1.Disconnect;
end;
end.

解决方案 »

  1.   

    在线等!!!
    顶一下!!
    这是client服务程序!!!
      

  2.   

    在循环里加上
    ServiceThread.ProcessRequests(False);
      

  3.   

    to sdzeng(大头鸟)
       可以了,那句ServiceThread.ProcessRequests(False);是什么意思。
       分马上给你。再提个问题,我怎么引用这个服务,
    是不是直接用这个语句:
    service1 .onexecute;
    麻烦了!!!!!
      

  4.   

    创建一个TService的时候,TService会创建一个ServiceThread,
    这有点像我们创建一个普通程序的时候,会创建一个主线程一样
    简单说,ServiceThread.ProcessRequests就是
    让TService的主线程响应用户的输入每次用控制面板里的服务管理器运行服务的时候,
    会触发onexecute事件,并执行其中的代码,一般不需要手动调用如果你想在服务程序里控制Service的运行,可以用DoStart.DoStop...
    来进行控制
      

  5.   

    比如说我有一buttonclick事件,
    我想在点击这个按扭,服务旧能执行,那么这段代码该怎么写!!
    谢谢!!!
      

  6.   

    service程序默认是不显示窗体的,要想Service程序显示窗体,
    需要额外的方法,具体怎么做,可以看看
    http://hackbase.com/hacker/program/200411148479.htm
    如果打算在Service的窗体上控制服务,可以调用TService.DoStart,DoStop...如果你打算用另外一个程序控制一个Service,则需要使用API
    OpenSCManager(),  OpenService(), ControlService()
    具体怎么做,网上资料很多,去查一下吧