抢分啊===如何用DELPHI5写一个NT服务,来打开(和关闭)配置文件里的多个可执行文件,500分啊!(200分)

  • 主题发起人 主题发起人 qqqqq
  • 开始时间 开始时间
Q

qqqqq

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用DELPHI5写一个NT服务,来打开(和关闭)配置文件里的多个可执行文件。这样我
就不用登陆NT系统自己就可以把我想预先执行的文件给启动,同时也可以我自己关闭
(人工的)。
高手请赐教,我给500分哦,如果不够在多也没有关系拉。我说明我要的是在DELPHI下,
NT 和 WIN2000 ADVANCE SERVER下都可以实现的原代码。
我是这样实现的,我先将可执行文件的路径写在INI文件中,然后用create process
来打开文件的,关闭用的TERMINITE,我在普通APPLICATION中是可以实现的,可是在
APPLICATIONG SERVICE 中就不可以拉。我的原代码在这,请兄弟姐妹们赐招!!
unit zz;
interface
uses
inifiles,Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
type
Tzzz = class(TService)
procedure ServiceStart(Sender: TService;
var Started: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController;
override;
{ Public declarations }
end;

var
zzz: Tzzz;
lpProcessInformation :array of TProcessInformation;
strcount:integer;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord);
stdcall;
begin
zzz.Controller(CtrlCode);
end;

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

procedure Tzzz.ServiceStart(Sender: TService;
var Started: Boolean);
var
pathini:TInifile;
inipath,sCommandLine:string;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
i:integer;
begin
//¶ÁÅäÖ÷¾¶Êý
inipath:=ExtractFilePath(paramstr(0))+'exepath.ini';
pathini := TIniFile.Create(inipath);
strcount:=strtoint(pathini.ReadString('exepath','count',''));
pathini.WriteString('exepath','count',inttostr(strcount)+'10000') ;
for i:=1 to strcountdo
begin
sCommandLine:=pathini.ReadString('exepath','path'+inttostr(i),'');
// ?? StartupInfo
FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0);
lpStartupInfo.cb := Sizeof(TStartupInfo);
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_NORMAL;
bCreateProcess := CreateProcess(nil, PChar(sCommandLine),
nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil, nil, lpStartupInfo, lpProcessInformation[i-1]);
end;
end;

end.

INI文件为EXEPATH。INI
[exepath]
count=3
path1=D:/Program Files/WinZip/WINZIP32.EXE
path2=D:/Program Files/Winamp/winamp.exe
path3=D:/Program Files/Internet Explorer/IEXPLORE.EXE
那位高人可以帮我解决啊,给多多分哦
 
出错信息是什么?
 
用一个空的SERVICE APPLICATION 是可以的,一旦加上我的这个服务内容就 不行拉,
可能是这个东东有问题,不能在SERVICE中用,可是为什么呢,有什么改进呢,请兄弟
赐教。
出错好象是内部服务出错。
 
createprocess的程序其实是在运行的,都在Task里面呢。。
 
都看不见,不信你showmessage,看能不能看到弹出对话框
 
在Tzzz服务的属性中,把"允许服务与桌面交互"打勾,试试看。
 
urus,果然如你所说,打上勾了就能够看得见啦...问题解决了,createprocess也看得见
 
被调用的程序有界面吗?
如果有界面,你的想法就不太对了,因为系统都不用登录,界面拿来有什么用?如
果只是需要有登录时自动启动,放在启动组或注册为系统启动即执行;或定制一个执行
计划也行
如果没有界面,为何不全都做成服务,注册为手工启动,由初始服务启动它们岂不
更妙?
如果你的被启动程序是有界面的,肯定会有问题
小弟,服务程序是不能有界面的,你的CreateProcess调用中使用
lpProcessAttributes=nil,即新创建的进程会使用父进程的属性,也是服务类型的,
同时你使用
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_NORMAL;
表示需要进行界面显示的,当然会出错了。
不信?在系统登录后启动,用你的服务程序调用一个程序(如Notepad.exe),使用任务
管理器看看能不能结束Nodepad.exe这个进程?
哈哈。。
 
在nt和2000中不是这个样子的,createprocess 只是创建一个进程,而不是一个服务。
如果要创建一个服务,需要用到其他的几个api函数
等我回家去看msdn然后再贴出来,好吗?大概就是mcmagement
然后就是可以用file->new->server也可以直接写,不过我还没有用过
比较而言,我还是喜欢用api
 
归纳一下:
1。服务程序不能有窗体;
2。将“interactive”属性打勾则能够显示一些提示信息;
提问一个:
如何实现多线程服务?即每个客户请求服务时自动产生一个服务线程?
 
?????????????????
 
后退
顶部