如题,如果在NT/2000/xp下把应用程序注册为系统服务呢?类似sqlserver
解决方案 »
- 在信息提示框中显示edit的信息,在线等哦!急急~~
- 怎样将jpeg图像转换为bmp,急呀,绝对高分
- 汉字转化成发音文件问题,原码分析
- 关于进度条的问题~~这个基本有点难~~比较烦
- edit组件中,如何按回车增加一行,并有滚动条出现?
- 一个简单的问题,关于类型的转换。
- 请教:怎么用delphi自动生成一个word文件(*.doc)!(分数不够面议!)
- 怎样建立一个有纵列、横行的表?(用微软的Access)且在DBGird里显示出来.
- 关键字:DBGrid中显示乱码,Edit中输入格式控制。
- spcom的commname为com10时,只要com后面的数字大于9,为两位数,就出错。我用的串口服务器是moxa,用超级终端可以看到数据的传输,但用spcom一startcom就出错。请各位给予帮助。谢谢。
- 哪里出错了?
- 怎样判断COMBOX中有几行数据呢?/?
打开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,程序编译运行后,系统将会将此服务程序卸掉。
建一个Service Appliation,看一看其中的规范,就知道了;
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.
SvcMgr.Application.CreateForm(TfrmURSvr, frmURSvr);当时这个问题很浪费我一些时间~~祝好运啊^_^更多方法,请参考:\Delphi6\Source\Vcl\ScktSrvr.dpr
你可以去看 \Delphi6\Source\Vcl\ScktSrvr.dpr 源代码,它有可视窗体的,以服务启动的话也可以在系统登录之前启动的。注意使用Mutex互斥体,保证程序在大多数时间段里只能运行一个实例(不管是以服务还是应用方式启动的);在“应用<->服务”之间切换,主要得考虑一些细节问题。