如题,如果在NT/2000/xp下把应用程序注册为系统服务呢?类似sqlserver

解决方案 »

  1.   

    Windows NT服务程序不同于一般的运行程序,它不需要NT登录进去,只需要开机进入NT系统便可以运行,一般用于系统服务方面的应用,学会编写NT服务程序对网络管理人员而言是非常重要的,Delphi作为一种高效、快速、强大的开发语言,为开发NT服务程序提供了非常便捷的方法,加上其可视化界面以及与数据库的完美结合,使我们开发与数据库有关的NT服务程序变得非常简单,下面以编写一个NT定期备份程序为例,介绍如何运用Delphi编写Windows NT的服务程序。
      打开Delphi编辑器,选择菜单中的File|New,在New Item中选择Service Application项,Delphi便自动为你建立一个基于TServiceApplication的新工程,TServiceApplication是一个封装NT服务程序的类,它包含一个TService1对象以及服务程序的装卸、注册、取消方法。
      将TService1对象的属性做下列更改:
      DisplayName与Name改为:DataBackup,ServiceStartName属性改为系统管理员用户(如DOMAIN\Administrator)和Password则输入用户密码
      这样,服务程序运行时将自己以该用户的权限操作NT。
      这样,一个NT服务程序编写已经完成,在Delphi编辑器中选择菜单Run|Parameters,在Parameters中输入/install,程序编译运行后,一个名为DataBackup的NT服务程序已经安装好,你可以双击控制面板中的服务项目,将会看到此服务程序,只是此服务程序没有任何东西而已;在Delphi编辑器中选择菜单Run|Parameters,在Parameters中输入/uninstall,程序编译运行后,系统将会将此服务程序卸掉。
      

  2.   

    delphi自己有可以帮你建立Service Appliation,如楼上所说。
      

  3.   

    普通应用程序好像不能注册为一个服务,必须符合一定的规范才行;
    建一个Service Appliation,看一看其中的规范,就知道了;
      

  4.   

    创建一个服务程序,在服务程序中运行你的程序ShellExecute
      

  5.   

    \Delphi6\Source\Vcl\ScktSrvr.dpr 看看把?下面的这一段可以用在程序“应用<->服务”转换之间,比如应用运行的话,就停止服务;应用退出的话,则启动服务
    unit ServiceUnit;
    { 服务控制单元 }
    interface
    uses
      Windows,SysUtils,Classes,Messages;procedure ServiceGrash;         //拦截服务
    procedure ServiceRescue;        //恢复服务implementation
    uses
     winSvc;const
     MyService='TCPPP_Server';var
     OrgStop:Boolean;       //原来是停止的procedure ServiceGrash;
    var
     SCHandle,BootpHandle:SC_HANDLE;
     ServiceStatus:SERVICE_STATUS;
    begin
     SCHandle:=OpenSCManager(nil,nil, SC_MANAGER_ALL_ACCESS);
     if SCHandle=0 then OrgStop:=True
     else begin
      BootpHandle:=OpenService(SCHandle,MyService, SERVICE_ALL_ACCESS);
      if BootpHandle=0 then OrgStop:=True
      else begin
       if QueryServiceStatus(BootpHandle,ServiceStatus) then Begin
         //查询状态成功
         OrgStop:=(ServiceStatus.dwCurrentState=SERVICE_STOPPED);
       End else OrgStop:=False;     //那应假设是启中的
       if Not OrgStop Then Begin
        //停止服务,由应用程序接管
        ServiceStatus.dwCurrentState:=SERVICE_STOPPED;
        ControlService(BootpHandle,SERVICE_CONTROL_STOP,ServiceStatus)
       end;
       CloseServiceHandle(BootpHandle);
      End;
      CloseServiceHandle(SCHandle);
     end;
    end;procedure ServiceRescue;
    var
     SCHandle,BootpHandle:SC_HANDLE;
     p:pchar;
    begin
    // if OrgStop then exit;  //原来是停止的,就不需要重启服务了
     SCHandle:=OpenSCManager(nil,nil, SC_MANAGER_ALL_ACCESS);
     if SCHandle<>0 then begin
      BootpHandle:=OpenService(SCHandle,MyService, SERVICE_ALL_ACCESS);
      if BootpHandle<>0 then begin
       //启动服务
       try StartService(BootpHandle,0,p);
       except Raise Exception.Create('启动服务失败,请再次尝试使用手工启动!');
       end;
       CloseServiceHandle(BootpHandle);
      End;
      CloseServiceHandle(SCHandle);
     end;
    End;end.
      

  6.   

    如果你需要在系统登录之前启动服务,需要注意一点窗体的创建,应该这样
    SvcMgr.Application.CreateForm(TfrmURSvr, frmURSvr);当时这个问题很浪费我一些时间~~祝好运啊^_^更多方法,请参考:\Delphi6\Source\Vcl\ScktSrvr.dpr
      

  7.   

    我就是把以前一个有可视窗体的应用程序改成可在“应用<->服务”间切换的一个单一程序的。
    你可以去看 \Delphi6\Source\Vcl\ScktSrvr.dpr 源代码,它有可视窗体的,以服务启动的话也可以在系统登录之前启动的。注意使用Mutex互斥体,保证程序在大多数时间段里只能运行一个实例(不管是以服务还是应用方式启动的);在“应用<->服务”之间切换,主要得考虑一些细节问题。