我原来在2000下做了一个服务程序,当时运行一切都正常
可是最近拿出来,在xp下运行时,发现无法启动服务,
跟踪调试,发现其根本无法执行ServiceStart方法,请问大侠是什么问题呀
现在即使弄到2000下,也无法执行
一下代码是几个相关的过程
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  TimeSrv.Controller(CtrlCode);
end;function TTimeSrv.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;procedure TTimeSrv.ServiceStart(Sender: TService; var Started: Boolean);
var
  th:TTLSThread;
begin
  gPath := ExtractFilePath(ParamStr(0));
  if gPath[length(gPath)]<>'\' then gPath := gPath+'\';
  WriteLog('启动服务');
  th := TTLSThread.Create(true);
  th.Resume;
  
  Started := true;
end;procedure TTimeSrv.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  WriteLog('停止服务');
  WriteLog('');
end;

解决方案 »

  1.   

    现在已决绝xp下无法启动问题——实现了其onexecute方法,,但是2000下,仍然不行。
    去掉了servicestart中的内容。
      

  2.   

    用皮肤控件没有?  是不是皮肤控件引起的呢?
    有个VCL皮肤控件 在XP下有问题
      

  3.   

    使用delphi的VCL类 TServiceApplication,TService这两个类来写NT的服务程序时1.如果在TService的ServiceStart事件中不创建一个线程,那么就在OnExecute事件中编写服务程序的处理代码,当前OnExecute结束时,ServiceThread就结束,而服务程序的运行就终止了2.就是楼主的情况,在TService的ServiceStart事件中创建一个子线程,这里就应该在OnExecute中等待该子线程的运行,而ServiceThread 则调用ProcessRequests这个函响应系统的处理珳求即可
    通常来说,第2种是比较常用的方法。可以在ServiceStart中创建抛出多个线程,来处理服务程序的业务,这样做相对来说对于扩展性,稳定性,效率上都是比较好的选择回到上面的问题,如果在刚才始2000下可以,xp不可以,修改后却变成了xp可以,2000不可以呵呵,好好检查代码吧
      

  4.   

    另外说一点上面的代码的效率ExtractFilePath,ExtractFileDir 都是获取路径的函数,但不同的地方是ExtractFilePath默认是会有后有一个 '\'根据上面的代码来说if gPath[length(gPath)]<>'\' then gPath := gPath+'\';这一句是可以注释的