关于开发NT服务程序的问题(200分)

  • 主题发起人 leohubble
  • 开始时间
L

leohubble

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我写了一个NT服务程序,但是为什么运行(或安装)之后,过一会就自己自动关闭了,我
在OnStart,OnPause,OnStop事件中都写了,还是不行。不知何故?
2、写NT服务程序时需要输入用户名和密码(以便加载),但是,如果我是发布这个软件的话,
是不可能设置每个不同用户的用户名和密码的,不知如果才能实现这个?就像Oracle等数据库
软件一样,安装之后,系统启动后服务自动运行(它肯定是得到了用户名和密码,要不如何加载)
不知这个功能如何做?
 
1. 不知道,估计是代码问题。你可以通过写日志文件等方式跟踪一下你的程序。
2. StartType := stAuto 即可自动运行。不需要为服务程序指定用户名和密码。
绝大多数服务的启动不需要指定帐户和密码,只需指定“本地系统帐户”即可。
 
Execute事件应写成结束不了的,循环
用户名和密码可不设
 
to:Baylon5,你对我的第二个问题的答复是对的,设成stAuto的确可以不写用户名和密码;
to:一生中最爱,
你说的Execute是什么意思?是不是要附加一个线程?
我现在做的这个试验,是在Tservice的框中放了一个timer,ontimer里面发了一个showmessage
要定时发出一个对话框就行了,结果执行几次自动就关掉了;
************************************我的代码如下******************************
unit srvtest;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls;

type
TTest = class(TService)
Timer1: TTimer;
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
Test: TTest;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Test.Controller(CtrlCode);
end;

function TTest.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TTest.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
continued:=true;
end;

procedure TTest.ServicePause(Sender: TService; var Paused: Boolean);
begin
paused:=true;
end;

procedure TTest.ServiceStart(Sender: TService; var Started: Boolean);
begin
started:=true;
end;

procedure TTest.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
stopped:=true;
end;

procedure TTest.Timer1Timer(Sender: TObject);
begin
showmessage('OK');
end;

end.
 
答:
1.服务程序不是这样运行的,你所说的是正常现像,如果要正常启动,就要在
控制面板中的[服务]中启动。也可以用net命令行启动服务
2.同意Baylon5
 
To:wwolf,
那是不是应该编译之后,用命令行安装,然后在服务中启动?现在我怎么在[服务]中找不到
我写的服务呢?
那如果我需要在安装了程序之后,启动我的程序,这个服务就启动该如何做?
另外,如果能讲的更细一些,就更好了。
 
Net help start 自已看看吧
 
在nt窗口中有ServicePause等过程,其中一个就是Execute
 
还是不行,我的程序如下,不知问题在那里:
unit srvtest;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls;

type
TTest = class(TService)
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceExecute(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
TTestThread=class(TThread)
public
procedure Execute;override;
end;
var
Test: TTest;

implementation

{$R *.DFM}
var TestThread:TTestThread;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Test.Controller(CtrlCode);
end;

function TTest.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TTest.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
continued:=true;
end;

procedure TTest.ServicePause(Sender: TService; var Paused: Boolean);
begin
paused:=true;
end;

procedure TTest.ServiceStart(Sender: TService; var Started: Boolean);
begin
TTestThread.Create(false);
started:=true;
end;

procedure TTest.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
stopped:=true;
end;

procedure TTest.ServiceExecute(Sender: TService);
begin
TTestThread.Create(false);
end;

{ TTestThread }

procedure TTestThread.Execute;
begin
while not terminated do
begin
showmessage('OK');
sleep(50000);
end;

end;

end.
 
procedure TTestThread.Execute;
begin
while not terminated do
begin
showmessage('OK');
sleep(50000);
end;

end;

服务不要于控制台交互 你可以写日志跟踪调试

最好不要用while 死循环 可以 设置一个timer
 
喳查书,我记得有个类是application.ProcessMessages的过程,
把那段话照搬即可
 
jumboo 说的对,services 程序不要于控制台打交道,如果需要和控制台打交道,
基本上可以说明这种应用不适于写成 services。
你应该使用别的方式,例如 services 程序发消息通知别的应用程序,
由别的应用程序完成交互工作。

如果确实需要,也许可以在服务管理器的该服务属性设置里面选中“允许服务与桌面交互”。

另外,如果需要安装服务,建立一快捷方式,命令行参数为 -install 即可,
如果需要卸载,命令行参数改成 -uninstall
 
该如何调试TSERVICE这样的服务程序?
 
我想
你们把启动一个服务的代码贴出来比较好
不过我不知道,我看过一个例子好长的。
在delphi猛料里
 
顶部