我编写的一个用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.
我的服务程序原代码如下::
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.
解决方案 »
- 如何在win98 se下得到显存大小
- 各位大侠帮帮忙!dbgrid问题:(如何改变dbgrid中某列的各行颜色)!?
- ADOQuery怎样可以取得字段值并存放到变量中?怎样将变量中的值存到ADOQuery的字段中?
- 为什么我老婆老和我逗气!每天一小吵。我快疯了!救我!!!!!!!
- 用过WPE的DELPHI高手来帮忙看看~~~
- egis来接分!!!
- 如何实现通过SQL语句,查询一个表中的某个字段的类型和长度。
- 如何把查询后的结果放入Tchecklistbox中......
- 如果实现combobox对于汉字输入的自选择功能?
- 两个问题,望赐教(100分)
- 再请教一个SQL语句问题,多谢:)
- 实时备份SQL数据库
顶一下!!
这是client服务程序!!!
ServiceThread.ProcessRequests(False);
可以了,那句ServiceThread.ProcessRequests(False);是什么意思。
分马上给你。再提个问题,我怎么引用这个服务,
是不是直接用这个语句:
service1 .onexecute;
麻烦了!!!!!
这有点像我们创建一个普通程序的时候,会创建一个主线程一样
简单说,ServiceThread.ProcessRequests就是
让TService的主线程响应用户的输入每次用控制面板里的服务管理器运行服务的时候,
会触发onexecute事件,并执行其中的代码,一般不需要手动调用如果你想在服务程序里控制Service的运行,可以用DoStart.DoStop...
来进行控制
我想在点击这个按扭,服务旧能执行,那么这段代码该怎么写!!
谢谢!!!
需要额外的方法,具体怎么做,可以看看
http://hackbase.com/hacker/program/200411148479.htm
如果打算在Service的窗体上控制服务,可以调用TService.DoStart,DoStop...如果你打算用另外一个程序控制一个Service,则需要使用API
OpenSCManager(), OpenService(), ControlService()
具体怎么做,网上资料很多,去查一下吧