在下作了一个service application,有操作界面的,主要是参考delphi的scktsrvr,现在有一些问题请教大家:
1、调试service有什么方便的方法?
2、如何通过控制界面控制启动、停止service,就象apache 和sqlserver manager那样。
3、现在我把程序作为service运行时从控制界面关闭时无响应,当普通应用程序运行时可以正常关闭,不知问题在那里。
手头没有资料,各位多多帮忙,300分决不食言!

解决方案 »

  1.   

    1。我调试基本是用log输出到文件的。
    {$IFDEF DEBUG}
    procedure CreateLog(LogStr:String);
    var
      FileName:String;
      LogFile:TextFile;
    begin
      FileName:=ChangeFileExt(ParamStr(0),'.log');
      AssignFile(LogFile,FileName);
      if FileExists(FileName) then
        Append(LogFile)
      else
        Rewrite(LogFile);
      WriteLn(LogFile,DateTimeToStr(Now)+':'+#9+LogStr);
      CloseFile(LogFile);
    end;
    {$ENDIF}
    在程序中用:
      {$IFDEF DEBUG}CreateLog('TMsgAgentThread.SetMailSendedFlag');{$ENDIF}
    来输出。2。下面这段函数示范了停止并反安装一个service程序,启动的和停止的差不多,自己翻msdn:
    function CanCreateService():Boolean;
    var
      SvcMgr:DWORD;
      ServiceHandle:DWORD;
      ServiceStatus:_SERVICE_STATUS;
    begin
      Result:=false;
      SvcMgr:=0;
      ServiceHandle:=0;
      try
        SvcMgr:=OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
        if SvcMgr=0 then begin
          {$IFDEF DEBUG}CreateLog('Error when open service manager');{$ENDIF}
          exit;
        end;
        ServiceHandle:=OpenService(SvcMgr,PChar(ServiceName),SERVICE_ALL_ACCESS);
        if ServiceHandle=0 then begin
          {$IFDEF DEBUG}CreateLog('Service havn''t been installed');{$ENDIF}
          Result:=true;
          exit;
        end;
        if not QueryServiceStatus(ServiceHandle,ServiceStatus) then begin
          {$IFDEF DEBUG}CreateLog('Error when query service status');{$ENDIF}
          exit;
        end;
        if ServiceStatus.dwCurrentState=SERVICE_RUNNING then begin
          {$IFDEF DEBUG}CreateLog('Service is running');{$ENDIF}
          if not ControlService(ServiceHandle,SERVICE_CONTROL_STOP,ServiceStatus) then begin
            {$IFDEF DEBUG}CreateLog('Error when stop service');{$ENDIF}
            exit;
          end;
        end;                              
        if not DeleteService(ServiceHandle) then begin
          {$IFDEF DEBUG}CreateLog('Error when delete service');{$ENDIF}
          exit;
        end;
        Result:=true;
      finally
        if SvcMgr<>0 then begin
          CloseServiceHandle(SvcMgr);
        end;
        if ServiceHandle<>0 then begin
          CloseServiceHandle(ServiceHandle);
        end;
      end;
    end;3。service程序中都必须使用thread来做真正的处理工作,不然你的程序就会无法响应消息。procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      MsgService.Controller(CtrlCode);
    end;function TMsgService.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;procedure TMsgService.ServiceStart(Sender: TService; var Started: Boolean);
    begin
      if not Assigned(FMsgAgentThread) then begin
        FMsgAgentThread:=TMsgAgentThread.Create(false);
        Started:=true;
      end
      else begin
        Started:=false;
      end;
    end;procedure TMsgService.ServiceStop(Sender: TService; var Stopped: Boolean);
    begin
      if Assigned(FMsgAgentThread) then begin
        FMsgAgentThread.Terminate;
        FMsgAgentThread.WaitFor;
        FreeAndNil(FMsgAgentThread);
        Stopped:=true;
      end
      else begin
        Stopped:=false;
      end;
    end;procedure TMsgService.ServicePause(Sender: TService; var Paused: Boolean);
    begin
      if Assigned(FMsgAgentThread) then begin
        FMsgAgentThread.Suspend;
        Paused:=true;
      end
      else begin
        Paused:=false;
      end;
    end;procedure TMsgService.ServiceContinue(Sender: TService;
      var Continued: Boolean);
    begin
      if Assigned(FMsgAgentThread) then begin
        FMsgAgentThread.Resume;
        Continued:=true;
      end
      else begin
        Continued:=false;
      end;
    end;差不多把我做的程序全贴给你了,再不会作的话我就胸闷了。。
      

  2.   

    谢谢楼上两位,特别是tonylk(tony),您的回复已收藏,慢慢消化。我的问题基本解决了。只是调试不知还有没有好的办法,最好能设断点。分一会再放吧,关于调试想听听还有没有别的意见