请问:Win NT下怎样将程序注册成服务器进程,程序如何实现?

cutelocust 2004-04-15 09:48:34
RT
...全文
149 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
visual_cjiajia 2004-05-05
  • 打赏
  • 举报
回复
你的头脑太简单了!
54993699 2004-05-05
  • 打赏
  • 举报
回复
晕,在nt下注册服务有这么难吗?不就是调用一个api函数么?

http://www.ba168.com/lbbs/cgi-bin/topic.cgi?forum=6&topic=140&show=0

很久以前写的,代码是抄国外一网站的。很简单,看看就懂。关键就是CreateService这个函数。
xiaoyaozgc 2004-04-25
  • 打赏
  • 举报
回复
up
xzhifei 2004-04-22
  • 打赏
  • 举报
回复
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.

xzhifei 2004-04-22
  • 打赏
  • 举报
回复
转几篇服务程序的文章:
运用Delphi编写Windows NT中服务程序

湖北省荆州市
胡佩敏

---- 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对象上加许多非可视化控件来与数据库关联,实现很多复杂
的功能。

qingenerp 2004-04-22
  • 打赏
  • 举报
回复
帮你顶一下!
welllove88 2004-04-22
  • 打赏
  • 举报
回复
建立的时候你是建立的 Service Application 吗?

如果是很容易的 在exe 所在目录 在Dos里写,xxx.exe /install
zfang 2004-04-22
  • 打赏
  • 举报
回复
帮顶
jinjazz 2004-04-22
  • 打赏
  • 举报
回复
你的程序路径\程序名.exe -install
mscrack 2004-04-22
  • 打赏
  • 举报
回复
instsrv.exe
mscrack 2004-04-21
  • 打赏
  • 举报
回复
好象Nt/2K 下, 不能簡單的將 exe 直接註冊成 service,
要導出相應的函數
--------------------
可以实现... 通过一个软件就能把一般程序注册到服务中, 记不清软件叫什么了, 但确实有这样的软件.
visual_cjiajia 2004-04-20
  • 打赏
  • 举报
回复
自己找书喽!
ly_liuyang 2004-04-20
  • 打赏
  • 举报
回复
用Delphi在NT可以进入Ring0的!!

http://lysoft.7u7.net提供Demo

但代码不公开的

使用Callgate方法就可以了,非常有技巧的
inforum 2004-04-20
  • 打赏
  • 举报
回复
也想知道!
顶起来!
bottom 2004-04-17
  • 打赏
  • 举报
回复
nt想进入RING0没这么简单 非常复杂的汇编!
bob008 2004-04-16
  • 打赏
  • 举报
回复
registersever


好象这个还不够,REALTIME也搞进去得了,呵呵,郁闷,NT,好象不能进RING0
cutelocust 2004-04-16
  • 打赏
  • 举报
回复
To fim(镇江DJ)(DJ=DelphiJava)

那是在98下的

我看我还是用delphi生成的那个吧
fim 2004-04-16
  • 打赏
  • 举报
回复
to aiirii(ari-爱的眼睛)
确实没有在2000下试过,以前在98下测试过,刚把它翻出来
aiirii 2004-04-16
  • 打赏
  • 举报
回复
to fim(镇江DJ)(DJ=DelphiJava);
你有在 Nt 下試過嗎??
你知道你代碼的意思嗎??
fim 2004-04-16
  • 打赏
  • 举报
回复
a simple one
function RegisterAsService : boolean;
const RSP_SIMPLE_SERVICE = 1;
var RSP : function (dwProcessID, dwType : DWORD) : DWORD; stdcall;
begin
RSP:=GetProcAddress(GetModuleHandle(kernel32),'RegisterServiceProcess');
result:=(@RSP<>nil) and (RSP(0,RSP_SIMPLE_SERVICE)=1);
end;
加载更多回复(7)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧