我在:
 Delphi2007 ver11.0.2902.10471
  windows2003
下做了一个服务程序 A.exe
然后我又另写一个安装程序对这个服务进行安装.我发现:
如果用 winexec(pchar('a.exe /install'),sw_hide) 能安装服务,但使用
    scm := OpenSCManager( Nil, Nil,SC_MANAGER_ALL_ACCESS);// SC_MANAGER_CONNECT );
     svc := OpenService( scm, PChar(aServiceName ), SERVICE_ALL_ACCESS );
  来检测这个服务时,scv值为0,表示没有这个服务存在.(其时在WINDOWS的服务列表中能看到A这个服务存在)
   用手工在WINDOS的服务管理列表中手工启动这个服务,服务运行正常.如果用
CreateService(hSCM,PChar(ServiceName),PChar(DisplayName),
    SERVICE_ALL_ACCESS,
   SERVICE_WIN32_OWN_PROCESS,
   SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
    PChar(sFileName), nil, nil, nil, nil, nil);
来安装程序,能安装上并且svc检查到,但是启动后发现服务程序没有反应.请问这是什么原因?

解决方案 »

  1.   

    用下面代码查询服务状态
    声明: 
            schService       :SC_HANDLE; 
            schSCManager   :SC_HANDLE; 
            ServiceStatus:TServiceStatus; 调用api: 
        schSCManager   :=   OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); 
        schService   :=   OpenService(schSCManager,'ser',SERVICE_ALL_ACCESS);     QueryServiceStatus(schService,ServiceStatus); 
        if   ServiceStatus.dwCurrentState   =   SERVICE_RUNNING   then           运行 
        else 
            没有运行 
        end; 
      

  2.   

    Function TfrmInstall.ServiceControl(aServiceName: String; aOp: Integer) : Boolean;
       Var
         scm : Cardinal;
         svc : Cardinal;
         sts : _SERVICE_STATUS;
         arg : PChar;
      begin
        Result := true;
      //  If ( ( GetVersion AND $80000000 ) = 0 ) Then  //  Is NT/2000
      //  Begin
           scm := OpenSCManager( Nil, Nil,SC_MANAGER_ALL_ACCESS);// SC_MANAGER_CONNECT );
           svc := OpenService( scm, PChar(aServiceName ), SERVICE_ALL_ACCESS );
           ServerExist:=Svc<>0;
           If ( svc <> 0 ) Then  //  *****这里是检查服务是否存在*****
           Begin
             QueryServiceStatus( svc, sts );  //  *****这里就是检查服务的状态*****
             ServerStart:=sts.dwCurrentState= SERVICE_RUNNING;         If ( ( ( aOp = 0 ) AND ( sts.dwCurrentState <> SERVICE_STOPPED ) )
              OR ( ( aOp = 1 ) AND ( sts.dwCurrentState <> SERVICE_RUNNING ) ) ) Then
             Begin
               arg := Nil;           If ( aOp = 0 ) Then  //  Stop
                  Result := ControlService( svc, SERVICE_CONTROL_STOP, sts )
               Else
                  Result := StartService( svc, 0, arg );
               End;
             CloseServiceHandle( svc );
            End;
          CloseServiceHandle( scm );
        End;
    以上是我的检测程序代码段.如果是用createServer函数安装的能被检查被启动,但用 winexec(pchar('a.exe /install',sw_hide)安装的就不能被检查到,