兄弟们,在XP下怎么将程序注册为系统服务啊?(50分)

  • 主题发起人 tsedlinux
  • 开始时间
T

tsedlinux

Unregistered / Unconfirmed
GUEST, unregistred user!
兄弟们,在XP下怎么将程序注册为系统服务啊?
RegisterServiceProcess(GetCurrentProcessID, 1);
用这个语句系统报入口错,怎么办啊?
 
这里还是大富翁吗? 这个问题都没有人知道吗?
 
兄弟们 不要见死不救啊?
 
你搜搜这方面的贴子吧,很多的
 
这个问题我也想了很久了,在很多论坛发表了也没有人给出个正确的解答!!
想不到这里也......我要疯了!!
 
?????????????????????????????????????????????????????????????????????????
 
no one could answer this question? is there DFW?
 
兄弟人中英文双语开攻实在利害,我初学者,给你up
给我加1分
 
---- Windows NT服务程序不同于一般的运行程序,它不需要NT登录进去,只需要开机进入
NT系统便可以运行,一般用于系统服务方面的应用,学会编写NT服务程序对网络管理人员而
言是非常重要的,Delphi4.0作为一种高效、快速、强大的开发语言,为开发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,程序编译运行后,系统将会将此服务
程序卸掉。
---- 服务程序是通过控制一个线程的生成、暂停、继续、停止来达到服务目的的,因此
我们必须加入一个Tsession对象来编写文件自动备份代码,在Delphi编辑器中选择菜单中
的File|New,在New Item中选择Thread Object项,Delphi会提示你为该Tsession对象输入
一个名称(输入DataCopy),Delphi便生成了一个基于Tsession的DataCopy对象,并提供了一
个Execute过程供重载,我们要Execute过程中输入以下程序:

var
Hour, Min, Sec, MSec: Word;
TimeStamp,DirectoryEdit1,DirectoryEdit2:String;
SearchRec: TSearchRec;
Source,Temp,Dest:pchar;
F,F1:THandle;
FF,FF1:WIN32_FIND_DATA;
Begin
{每次文件备份执行时间}
TimeStamp:='12:00';
{文件备份源目录}
DirectoryEdit1:='C:/temp';
{文件备份目录}
DirectoryEdit2:='C:/temp1';
while True do
begin
DecodeTime(Time,Hour, Min, Sec, MSec);
IF Trim(TimeStamp)=Format
('%-2.2d:%-2.2d',[Hour,Min]) then
begin
GetMem(Source,250);
GetMem(Dest,250);
GetMem(Temp,250);
StrPcopy(Dest,DirectoryEdit2+'/
'+FormatDateTime('YYYYMMDD',Date));
CreateDirectory(Dest,nil);
IFFindFirst(DirectoryEdit1+'/*.*',faAnyFile,
SearchRec)=0 then
begin
repeat
StrPcopy(Source,DirectoryEdit1+'/'+SearchRec.Name);

StrPcopy(Dest,DirectoryEdit2+'/'
+FormatDateTime('YYYYMMDD',Date)+'/'+SearchRec.Name);
copyfile(Source,Dest,False);
until FindNext(SearchRec)< >0;
end;
SysUtils.FindClose(SearchRec);
FindClose(F);
FreeMem(Source,250);
FreeMem(Dest,250);
FreeMem(Temp,250);
end;
sleep(60000);
end;

end;
---- 此线程执行时每隔一分钟将检查一次时间,看是否到了备份时间,如果是则将
DirectoryEdit1中的所有文件拷到DirectoryEdit2目录中去。

---- 现在编写服务控制DataCopy线程的代码,在TdataBackup对象中的OnStart、OnStop、
OnPause、OnContinue事件中分别输入如下代码:

procedure TDataBackup.DataBackupStart
(Sender: TService;
var Started: Boolean);
begin
DataThread:= TDataCopy.Create(False);
Started := True;
end;

procedure TDataBackup.DataBackupStop
(Sender: TService;
var Stopped: Boolean);
begin
DataThread.Terminate;
Stopped := True;
end;

procedure TDataBackup.DataBackupPause
(Sender: TService;
var Paused: Boolean);
begin
DataThread.Suspend;
Paused := True;
end;
procedure TDataBackup.DataBackupContinue
(Sender: TService;
var Continued: Boolean);
begin
DataThread.Resume;
Continued := True;
end;

---- 这样一个文件自动备份程序已经完成,编译好后,加上/install参数执行程序,系统
会将此服务程序安装,由于服务程序中StartType属性为stAuto,NT每次启动时,此程序自
动执行,你可以在控制面板中的服务项目来启动、暂停、恢复、停止它,也可以加上/uninstall
参数执行程序来卸掉它。通过上述例子我们可以看到,用Delphi编写NT服务器程序十分方
便,而且你也可以在Tservice对象上加许多非可视化控件来与数据库关联,实现很多复杂
的功能。
 
Delphi 编写Windows NT服务


1.产生一个Win32服务应用

  产生一个Win32服务应用,选择File|New菜单,在New Items页中选择Service Application。
这样在你的工程里加入一个全局变量命名的应用,它是 TserviceApplication类型。每个服
务工程自动的声明一个TServiceApplication 实例,并不需要直接的对它编程。另外自动产
生一个TService对象。
  当你产生一个服务应用,你会在设计环境中看到一个窗口,它对应了一个服务 (Tservice)。
在Object Inspector中设置它的属性和事件以实现它。在你的服务应用中可以加入其他的服
务。不要将Service加入在一个非Service Application中。当加入一个TService对象时,
因为服务,应用将不产生事件请求和使用合适的窗口调用。



2.TServiceApplication

  TServiceApplication封装了windows NT Service Application。它提供服务应用的基
本行为框架。它包含TService对象,每个Tservice封装了一个NT服务。服务应用提供服务产
生、安装、注册、分发和卸载的方法。



注意,不要在工程的uses列表中加入Forms或HtppApp,因为这些单元有些

Aplication变量有冲突。



3.TService

每个Tservice都有一个线程。

特性

AllowPause

AllowStop

Dependencies

DisplayName

ErrCode

ErrorSeverity

Interactive

LoadGroup

Param

ParamCount

Password

ServiceStartName

ServiceThread



ServiceType

StartType

Status

TagID

Terminated

WaitHint

Win32ErrCode



方法:

Create

Destroy

GetServiceController

LogMessage

ReportStatus



事件

AfterInstall

AfterUninstall

BeforeInstall

BeforeUninstall

OnContinue

OnExecute

OnPause

OnShutdown

OnStart

OnStop



4.样例
  例子使用一个TserverSocket,端口设为80,这个例子将在c:/temp目录下产生一个文
本文件,名字为WebLogxxx.log(xxx是线程IDThreadID)。看运行结果:启动程序,打开一
个Web浏览器,键入localhost,等待浏览器将超时,然后在c:/temp中将有一个Weblogxxx.log
文件。

interface

uses



Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,

ScktComp;



type



TService1 = class(TService)

ServerSocket1: TServerSocket;

procedure ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

procedure Service1Execute(Sender: TService);

private

{ Private declarations }

Stream: TMemoryStream;

public

function GetServiceController: PServiceController; override;

{ Public declarations }

end;



var



Service1: TService1;



implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;



begin

Service1.Controller(CtrlCode);

end;



function TService1.GetServiceController: PServiceController;



begin

Result := @ServiceController;

end;



procedure TService1.ServerSocket1ClientRead(Sender: TObject;



Socket: TCustomWinSocket);

var

Buffer: PChar;



begin



Buffer := nil;



while Socket.ReceiveLength > 0 do begin



try

Buffer := AllocMem(Socket.ReceiveLength);

Socket.ReceiveBuf(Buffer^, Socket.ReceiveLength);

Stream.Write(Buffer^, StrLen(Buffer));

finally

FreeMem(Buffer);

end;



Stream.Seek(0, soFromBeginning);



Stream.SaveToFile('c:/Temp/Weblog' + IntToStr(ServiceThread.ThreadID) + '.lo

');

end;

end;



procedure TService1.Service1Execute(Sender: TService);



begin

Stream := TMemoryStream.Create;

try

ServerSocket1.Port := 80; // WWW port

ServerSocket1.Active := True;



while not Terminated do begin



ServiceThread.ProcessRequests(False);

end;



ServerSocket1.Active := False;



finally

Stream.Free;

end;

end;



end.
 
多人接受答案了。
 
顶部