我写了一个NT服务,我想在服务中添加一个窗体,如何操作?(100分)

  • 主题发起人 主题发起人 想飞的男孩
  • 开始时间 开始时间

想飞的男孩

Unregistered / Unconfirmed
GUEST, unregistred user!
1、大家如果说既然做了服务何必加窗体,服务有服务的好处,权限控制之后不能关闭等等,而窗体有窗体的必要,显示大量的信息就不是ShowMessage能够做到的,而程序中交互是必要的,参数设置等等!
2、如果是服务调用Dll,在Dll中打开窗体,这个方法妖怪了点,暂时不考虑!
3、如果是Forms.Application.CreateForm(TMainForm, MainForm);我试验过了,没有显示出来,可能我写的不正确!
4、我也试验了,在服务启动的线程中,写入窗体的创建显示的代码,但是线程干活了,窗体没有显示!包括窗体的OnCreate也没有被调用!
5、也试验了,在服务的OnStart中,写入窗体的创建显示的代码,服务崩了!
6、顺,google和大富翁中任意关键字“NT 服务 窗体”的帖子我也都看了!
7、知道的朋友望赐教!如果有思路,我也可以马上试验!
 
服务里边好像不能弹出窗口的,可能是消息系统的问题。不一定非要把窗体做到服务里,只要作个程序和服务程序进行交互,同样能达到目的。
 
可以做在里面的要设置一下
Interactive,当这个属性为True的时候,该服务程序就可以与桌面交互了.
 
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr;

type
(*----------------------------------------------------------------------------------*)
TSvTProTime = class(TService)
procedure ServiceStart(Sender: TService;
var Started: Boolean);
procedure ServiceStop(Sender: TService;
var Stopped: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServiceContinue(Sender: TService;
var Continued: Boolean);
private
procedure DisplayForm;
procedure StartServer;
procedure StopServer;
public
bDisplaying: Boolean;
function GetServiceController: TServiceController;
override;
end;

var
SvTProTime: TSvTProTime;
implementation
{$R *.DFM}
uses
Unit1, Forms;
var
F: TForm;
{ methods }
(*--------------------------------------------------------------------------------*)
procedure TSvTProTime.DisplayForm;
begin
if bDisplaying then
Exit;
bDisplaying := True;
F := TForm1.Create(nil);
//F.Show;
end;
(*--------------------------------------------------------------------------------*)
procedure TSvTProTime.StartServer;
begin
bDisplaying := False;
end;
(*--------------------------------------------------------------------------------*)
procedure TSvTProTime.StopServer;
begin
if bDisplaying then
F.Free;
end;

{ events }
(*--------------------------------------------------------------------------------*)
procedure ServiceController(CtrlCode: DWord);
stdcall;
begin
SvTProTime.Controller(CtrlCode);
end;
(*--------------------------------------------------------------------------------*)
function TSvTProTime.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
(*--------------------------------------------------------------------------------*)
procedure TSvTProTime.ServiceStart(Sender: TService;
var Started: Boolean);
begin
Started := True;
gbCanClose := False;
end;
(*--------------------------------------------------------------------------------*)
procedure TSvTProTime.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
ServiceThread.Terminate;
Stopped := True;
gbCanClose := True;
end;
(*--------------------------------------------------------------------------------*)
procedure TSvTProTime.ServiceExecute(Sender: TService);
begin
StartServer;
try
while not Terminateddo
begin
ServiceThread.ProcessRequests(False);
Sleep(100);
DisplayForm;
end
finally
StopServer;
end;
end;

procedure TSvTProTime.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
Continued := True;
end;

end.
 
后退
顶部