当前位置:中国易下载软件教材中心文章中心编程语言Delphi → 用Delphi创建服务程序

用Delphi创建服务程序

减小字体 增大字体 作者:佚名  来源:不详  发布时间:2007-8-21 0:58:19
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
(1)不用登陆进系统即可运行.cjn海岸线网络安全资讯站
(2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.cjn海岸线网络安全资讯站
运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成一个服务程序的框架.将工程保存为ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我们注意到,Service有几个属性.其中以下几个是我们比较常用的:cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
(1)DisplayName:服务的显示名称cjn海岸线网络安全资讯站
(2)Name:服务名称.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
我们在这里将DisplayName的值改为"Delphi服务演示程序",Name改为"DelphiService".编译这个项目,将得到 ServiceDemo.exe.这已经是一个服务程序了!进入CMD模式,切换致工程所在目录,运行命令"ServiceDemo.exe /install",将提示服务安装成功!然后"net start DelphiService"将启动这个服务.进入控制面版-->管理工具-->服务,将显示这个服务和当前状态.不过这个服务现在什么也干不了,因为我们还没有写代码:)先"net stop DelphiService"停止再"ServiceDemo.exe /uninstall"删除这个服务.回到Delphi7的IDE.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
我们的计划是为这个服务添加一个主窗口,运行后任务栏显示程序的图标,双击图标将显示主窗口,上面有一个按钮,点击该按钮将实现Ctrl+Alt+Del功能.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
实际上,服务程序莫认是工作于Winlogon桌面的,可以打开控制面板,查看我们刚才那个服务的属性-->登陆,其中"允许服务与桌面交互 "是不打钩的.怎么办?呵呵,回到IDE,注意那个布尔属性:Interactive,当这个属性为True的时候,该服务程序就可以与桌面交互了.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
File-->New-->Form为服务添加窗口FrmMain,单元保存为Unit_FrmMain,并且把这个窗口设置为手工创建.完成后的代码如下:cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
unit Unit_Main;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
interfacecjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
usescjn海岸线网络安全资讯站
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Unit_FrmMain;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
typecjn海岸线网络安全资讯站
TDelphiService = class(TService)cjn海岸线网络安全资讯站
procedure ServiceContinue(Sender: TService; var Continued: Boolean);cjn海岸线网络安全资讯站
procedure ServiceExecute(Sender: TService);cjn海岸线网络安全资讯站
procedure ServicePause(Sender: TService; var Paused: Boolean);cjn海岸线网络安全资讯站
procedure ServiceShutdown(Sender: TService);cjn海岸线网络安全资讯站
procedure ServiceStart(Sender: TService; var Started: Boolean);cjn海岸线网络安全资讯站
procedure ServiceStop(Sender: TService; var Stopped: Boolean);cjn海岸线网络安全资讯站
privatecjn海岸线网络安全资讯站
{ Private declarations }cjn海岸线网络安全资讯站
publiccjn海岸线网络安全资讯站
function GetServiceController: TServiceController; override;cjn海岸线网络安全资讯站
{ Public declarations }cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
DelphiService: TDelphiService;cjn海岸线网络安全资讯站
FrmMain: TFrmMain;cjn海岸线网络安全资讯站
implementationcjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
{$R *.DFM}cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure ServiceController(CtrlCode: DWord); stdcall;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
DelphiService.Controller(CtrlCode);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
function TDelphiService.GetServiceController: TServiceController;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Result := ServiceController;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TDelphiService.ServiceContinue(Sender: TService;cjn海岸线网络安全资讯站
var Continued: Boolean);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
while not Terminated docjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Sleep(10);cjn海岸线网络安全资讯站
ServiceThread.ProcessRequests(False);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TDelphiService.ServiceExecute(Sender: TService);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
while not Terminated docjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Sleep(10);cjn海岸线网络安全资讯站
ServiceThread.ProcessRequests(False);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TDelphiService.ServicePause(Sender: TService;cjn海岸线网络安全资讯站
var Paused: Boolean);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Paused := True;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TDelphiService.ServiceShutdown(Sender: TService);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
gbCanClose := true;cjn海岸线网络安全资讯站
FrmMain.Free;cjn海岸线网络安全资讯站
Status := csStopped;cjn海岸线网络安全资讯站
ReportStatus();cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TDelphiService.ServiceStart(Sender: TService;cjn海岸线网络安全资讯站
var Started: Boolean);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Started := True;cjn海岸线网络安全资讯站
Svcmgr.Application.CreateForm(TFrmMain, FrmMain);cjn海岸线网络安全资讯站
gbCanClose := False;cjn海岸线网络安全资讯站
FrmMain.Hide;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TDelphiService.ServiceStop(Sender: TService;cjn海岸线网络安全资讯站
var Stopped: Boolean);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Stopped := True;cjn海岸线网络安全资讯站
gbCanClose := True;cjn海岸线网络安全资讯站
FrmMain.Free;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
end.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
主窗口单元如下:cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
unit Unit_FrmMain;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
interfacecjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
usescjn海岸线网络安全资讯站
Windows, Messages, SysUtils, Variants, Classes, ShellApi, Graphics, Controls, Forms,cjn海岸线网络安全资讯站
Dialogs, ExtCtrls, StdCtrls;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
constcjn海岸线网络安全资讯站
WM_TrayIcon = WM_USER + 1234;cjn海岸线网络安全资讯站
typecjn海岸线网络安全资讯站
TFrmMain = class(TForm)cjn海岸线网络安全资讯站
Timer1: TTimer;cjn海岸线网络安全资讯站
Button1: TButton;cjn海岸线网络安全资讯站
procedure FormCreate(Sender: TObject);cjn海岸线网络安全资讯站
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);cjn海岸线网络安全资讯站
procedure FormDestroy(Sender: TObject);cjn海岸线网络安全资讯站
procedure Timer1Timer(Sender: TObject);cjn海岸线网络安全资讯站
procedure Button1Click(Sender: TObject);cjn海岸线网络安全资讯站
privatecjn海岸线网络安全资讯站
{ Private declarations }cjn海岸线网络安全资讯站
IconData: TNotifyIconData;cjn海岸线网络安全资讯站
procedure AddIconToTray;cjn海岸线网络安全资讯站
procedure DelIconFromTray;cjn海岸线网络安全资讯站
procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;cjn海岸线网络安全资讯站
procedure SysButtonMsg(var Msg: TMessage); message WM_SYSCOMMAND;cjn海岸线网络安全资讯站
publiccjn海岸线网络安全资讯站
{ Public declarations }cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
FrmMain: TFrmMain;cjn海岸线网络安全资讯站
gbCanClose: Boolean;cjn海岸线网络安全资讯站
implementationcjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
{$R *.dfm}cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.FormCreate(Sender: TObject);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
FormStyle := fsStayOnTop;cjn海岸线网络安全资讯站
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);cjn海岸线网络安全资讯站
gbCanClose := False;cjn海岸线网络安全资讯站
Timer1.Interval := 1000;cjn海岸线网络安全资讯站
Timer1.Enabled := True;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
CanClose := gbCanClose;cjn海岸线网络安全资讯站
if not CanClose thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Hide;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.FormDestroy(Sender: TObject);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Timer1.Enabled := False;cjn海岸线网络安全资讯站
DelIconFromTray;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.AddIconToTray;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
ZeroMemory(@IconData, SizeOf(TNotifyIconData));cjn海岸线网络安全资讯站
IconData.cbSize := SizeOf(TNotifyIconData);cjn海岸线网络安全资讯站
IconData.Wnd := Handle;cjn海岸线网络安全资讯站
IconData.uID := 1;cjn海岸线网络安全资讯站
IconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;cjn海岸线网络安全资讯站
IconData.uCallbackMessage := WM_TrayIcon;cjn海岸线网络安全资讯站
IconData.hIcon := Application.Icon.Handle;cjn海岸线网络安全资讯站
IconData.szTip := Delphi服务演示程序;cjn海岸线网络安全资讯站
Shell_NotifyIcon(NIM_ADD, @IconData);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.DelIconFromTray;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
Shell_NotifyIcon(NIM_DELETE, @IconData);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.SysButtonMsg(var Msg: TMessage);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
if (Msg.wParam = SC_CLOSE) orcjn海岸线网络安全资讯站
(Msg.wParam = SC_MINIMIZE) then Hidecjn海岸线网络安全资讯站
else inherited; // 执行默认动作cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.TrayIconMessage(var Msg: TMessage);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
if (Msg.LParam = WM_LBUTTONDBLCLK) then Show();cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.Timer1Timer(Sender: TObject);cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
AddIconToTray;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure SendHokKey;stdcall;cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
HDesk_WL: HDESK;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
HDesk_WL := OpenDesktop (Winlogon, 0, False, DESKTOP_JOURNALPLAYBACK);cjn海岸线网络安全资讯站
if (HDesk_WL <> 0) thencjn海岸线网络安全资讯站
if (SetThreadDesktop (HDesk_WL) = True) thencjn海岸线网络安全资讯站
PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG (MOD_ALT or MOD_CONTROL, VK_DELETE));cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure TFrmMain.Button1Click(Sender: TObject);cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
dwThreadID : DWORD;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
CreateThread(nil, 0, @SendHokKey, nil, 0, dwThreadID);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
end.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
补充:cjn海岸线网络安全资讯站
(1)关于更多服务程序的演示程序,请访问以下Url:http://www.torry.net/pages.php?id=226,上面包含了多个演示如何控制和管理系统服务代码.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
(2)请切记:Windows实际上存在多个桌面.例如屏幕传输会出现白屏,可能有两个原因:一是系统处于锁定或未登陆桌面,二是处于屏幕保护桌面.这时候要将当前桌面切换到该桌面才能抓屏.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
(3)关于服务程序与桌面交互,还有种动态切换方法.大概单元如下:cjn海岸线网络安全资讯站
unit ServiceDesktop;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
interfacecjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
function InitServiceDesktop: boolean;cjn海岸线网络安全资讯站
procedure DoneServiceDeskTop;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
implementationcjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
uses Windows, SysUtils;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
constcjn海岸线网络安全资讯站
DefaultWindowStation = WinSta0;cjn海岸线网络安全资讯站
DefaultDesktop = Default;cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
hwinstaSave: HWINSTA;cjn海岸线网络安全资讯站
hdeskSave: HDESK;cjn海岸线网络安全资讯站
hwinstaUser: HWINSTA;cjn海岸线网络安全资讯站
hdeskUser: HDESK;cjn海岸线网络安全资讯站
function InitServiceDesktop: boolean;cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
dwThreadId: DWORD;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
dwThreadId := GetCurrentThreadID;cjn海岸线网络安全资讯站
// Ensure connection to service window station and desktop, andcjn海岸线网络安全资讯站
// save their handles.cjn海岸线网络安全资讯站
hwinstaSave := GetProcessWindowStation;cjn海岸线网络安全资讯站
hdeskSave := GetThreadDesktop(dwThreadId);cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);cjn海岸线网络安全资讯站
if hwinstaUser = 0 thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
OutputDebugString(PChar(OpenWindowStation failed + SysErrorMessage(GetLastError)));cjn海岸线网络安全资讯站
Result := false;cjn海岸线网络安全资讯站
exit;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
if not SetProcessWindowStation(hwinstaUser) thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
OutputDebugString(SetProcessWindowStation failed);cjn海岸线网络安全资讯站
Result := false;cjn海岸线网络安全资讯站
exit;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);cjn海岸线网络安全资讯站
if hdeskUser = 0 thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
OutputDebugString(OpenDesktop failed);cjn海岸线网络安全资讯站
SetProcessWindowStation(hwinstaSave);cjn海岸线网络安全资讯站
CloseWindowStation(hwinstaUser);cjn海岸线网络安全资讯站
Result := false;cjn海岸线网络安全资讯站
exit;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
Result := SetThreadDesktop(hdeskUser);cjn海岸线网络安全资讯站
if not Result thencjn海岸线网络安全资讯站
OutputDebugString(PChar(SetThreadDesktop + SysErrorMessage(GetLastError)));cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
procedure DoneServiceDeskTop;cjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
// Restore window station and desktop.cjn海岸线网络安全资讯站
SetThreadDesktop(hdeskSave);cjn海岸线网络安全资讯站
SetProcessWindowStation(hwinstaSave);cjn海岸线网络安全资讯站
if hwinstaUser <> 0 thencjn海岸线网络安全资讯站
CloseWindowStation(hwinstaUser);cjn海岸线网络安全资讯站
if hdeskUser <> 0 thencjn海岸线网络安全资讯站
CloseDesktop(hdeskUser);cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
initializationcjn海岸线网络安全资讯站
InitServiceDesktop;cjn海岸线网络安全资讯站
finalizationcjn海岸线网络安全资讯站
DoneServiceDesktop;cjn海岸线网络安全资讯站
end.cjn海岸线网络安全资讯站
更详细的演示代码请参看:http://www.torry.net/samples/samples/os/isarticle.zipcjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
(4)关于安装服务如何添加服务描述.有两种方法:一是修改注册表.服务的详细信息都位于HKEY_LOCAL_MACHINESYSTEM ControlSet001Services下面,例如我们刚才那个服务就位于HKEY_LOCAL_MACHINESYSTEM ControlSet001ServicesDelphiService下.第二种方法就是先用QueryServiceConfig2函数获取服务信息,然后ChangeServiceConfig2来改变描述.用Delphi实现的话,单元如下:cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
unit WinSvcEx;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
interfacecjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
uses Windows, WinSvc;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
constcjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
// Service config info levelscjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
SERVICE_CONFIG_DESCRIPTION = 1;cjn海岸线网络安全资讯站
SERVICE_CONFIG_FAILURE_ACTIONS = 2;cjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
// DLL name of imported functionscjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
AdvApiDLL = advapi32.dll;cjn海岸线网络安全资讯站
typecjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
// Service description stringcjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
PServiceDescriptionA = ^TServiceDescriptionA;cjn海岸线网络安全资讯站
PServiceDescriptionW = ^TServiceDescriptionW;cjn海岸线网络安全资讯站
PServiceDescription = PServiceDescriptionA;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SERVICE_DESCRIPTIONA}cjn海岸线网络安全资讯站
_SERVICE_DESCRIPTIONA = recordcjn海岸线网络安全资讯站
lpDescription : PAnsiChar;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SERVICE_DESCRIPTIONW}cjn海岸线网络安全资讯站
_SERVICE_DESCRIPTIONW = recordcjn海岸线网络安全资讯站
lpDescription : PWideChar;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SERVICE_DESCRIPTION}cjn海岸线网络安全资讯站
_SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;cjn海岸线网络安全资讯站
{$EXTERNALSYM SERVICE_DESCRIPTIONA}cjn海岸线网络安全资讯站
SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA;cjn海岸线网络安全资讯站
{$EXTERNALSYM SERVICE_DESCRIPTIONW}cjn海岸线网络安全资讯站
SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW;cjn海岸线网络安全资讯站
{$EXTERNALSYM SERVICE_DESCRIPTION}cjn海岸线网络安全资讯站
SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;cjn海岸线网络安全资讯站
TServiceDescriptionA = _SERVICE_DESCRIPTIONA;cjn海岸线网络安全资讯站
TServiceDescriptionW = _SERVICE_DESCRIPTIONW;cjn海岸线网络安全资讯站
TServiceDescription = TServiceDescriptionA;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
// Actions to take on service failurecjn海岸线网络安全资讯站
//cjn海岸线网络安全资讯站
{$EXTERNALSYM _SC_ACTION_TYPE}cjn海岸线网络安全资讯站
_SC_ACTION_TYPE = (SC_ACTION_NONE, SC_ACTION_RESTART, SC_ACTION_REBOOT, SC_ACTION_RUN_COMMAND);cjn海岸线网络安全资讯站
{$EXTERNALSYM SC_ACTION_TYPE}cjn海岸线网络安全资讯站
SC_ACTION_TYPE = _SC_ACTION_TYPE;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
PServiceAction = ^TServiceAction;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SC_ACTION}cjn海岸线网络安全资讯站
_SC_ACTION = recordcjn海岸线网络安全资讯站
aType : SC_ACTION_TYPE;cjn海岸线网络安全资讯站
Delay : DWORD;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
{$EXTERNALSYM SC_ACTION}cjn海岸线网络安全资讯站
SC_ACTION = _SC_ACTION;cjn海岸线网络安全资讯站
TServiceAction = _SC_ACTION;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
PServiceFailureActionsA = ^TServiceFailureActionsA;cjn海岸线网络安全资讯站
PServiceFailureActionsW = ^TServiceFailureActionsW;cjn海岸线网络安全资讯站
PServiceFailureActions = PServiceFailureActionsA;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SERVICE_FAILURE_ACTIONSA}cjn海岸线网络安全资讯站
_SERVICE_FAILURE_ACTIONSA = recordcjn海岸线网络安全资讯站
dwResetPeriod : DWORD;cjn海岸线网络安全资讯站
lpRebootMsg : LPSTR;cjn海岸线网络安全资讯站
lpCommand : LPSTR;cjn海岸线网络安全资讯站
cActions : DWORD;cjn海岸线网络安全资讯站
lpsaActions : ^SC_ACTION;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SERVICE_FAILURE_ACTIONSW}cjn海岸线网络安全资讯站
_SERVICE_FAILURE_ACTIONSW = recordcjn海岸线网络安全资讯站
dwResetPeriod : DWORD;cjn海岸线网络安全资讯站
lpRebootMsg : LPWSTR;cjn海岸线网络安全资讯站
lpCommand : LPWSTR;cjn海岸线网络安全资讯站
cActions : DWORD;cjn海岸线网络安全资讯站
lpsaActions : ^SC_ACTION;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
{$EXTERNALSYM _SERVICE_FAILURE_ACTIONS}cjn海岸线网络安全资讯站
_SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;cjn海岸线网络安全资讯站
{$EXTERNALSYM SERVICE_FAILURE_ACTIONSA}cjn海岸线网络安全资讯站
SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA;cjn海岸线网络安全资讯站
{$EXTERNALSYM SERVICE_FAILURE_ACTIONSW}cjn海岸线网络安全资讯站
SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW;cjn海岸线网络安全资讯站
{$EXTERNALSYM SERVICE_FAILURE_ACTIONS}cjn海岸线网络安全资讯站
SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;cjn海岸线网络安全资讯站
TServiceFailureActionsA = _SERVICE_FAILURE_ACTIONSA;cjn海岸线网络安全资讯站
TServiceFailureActionsW = _SERVICE_FAILURE_ACTIONSW;cjn海岸线网络安全资讯站
TServiceFailureActions = TServiceFailureActionsA;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
///////////////////////////////////////////////////////////////////////////cjn海岸线网络安全资讯站
// API Function Prototypescjn海岸线网络安全资讯站
///////////////////////////////////////////////////////////////////////////cjn海岸线网络安全资讯站
TQueryServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpBuffer : pointer;cjn海岸线网络安全资讯站
cbBufSize : DWORD; var pcbBytesNeeded) : BOOL; stdcall;cjn海岸线网络安全资讯站
TChangeServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpInfo : pointer) : BOOL; stdcall;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
hDLL : THandle ;cjn海岸线网络安全资讯站
LibLoaded : boolean ;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
varcjn海岸线网络安全资讯站
OSVersionInfo : TOSVersionInfo;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
{$EXTERNALSYM QueryServiceConfig2A}cjn海岸线网络安全资讯站
QueryServiceConfig2A : TQueryServiceConfig2;cjn海岸线网络安全资讯站
{$EXTERNALSYM QueryServiceConfig2W}cjn海岸线网络安全资讯站
QueryServiceConfig2W : TQueryServiceConfig2;cjn海岸线网络安全资讯站
{$EXTERNALSYM QueryServiceConfig2}cjn海岸线网络安全资讯站
QueryServiceConfig2 : TQueryServiceConfig2;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
{$EXTERNALSYM ChangeServiceConfig2A}cjn海岸线网络安全资讯站
ChangeServiceConfig2A : TChangeServiceConfig2;cjn海岸线网络安全资讯站
{$EXTERNALSYM ChangeServiceConfig2W}cjn海岸线网络安全资讯站
ChangeServiceConfig2W : TChangeServiceConfig2;cjn海岸线网络安全资讯站
{$EXTERNALSYM ChangeServiceConfig2}cjn海岸线网络安全资讯站
ChangeServiceConfig2 : TChangeServiceConfig2;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
implementationcjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
initializationcjn海岸线网络安全资讯站
OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);cjn海岸线网络安全资讯站
GetVersionEx(OSVersionInfo);cjn海岸线网络安全资讯站
if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSVersionInfo.dwMajorVersion >= 5) thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
if hDLL = 0 thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
hDLL:=GetModuleHandle(AdvApiDLL);cjn海岸线网络安全资讯站
LibLoaded := False;cjn海岸线网络安全资讯站
if hDLL = 0 thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
hDLL := LoadLibrary(AdvApiDLL);cjn海岸线网络安全资讯站
LibLoaded := True;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
if hDLL <> 0 thencjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
@QueryServiceConfig2A := GetProcAddress(hDLL, QueryServiceConfig2A);cjn海岸线网络安全资讯站
@QueryServiceConfig2W := GetProcAddress(hDLL, QueryServiceConfig2W);cjn海岸线网络安全资讯站
@QueryServiceConfig2 := @QueryServiceConfig2A;cjn海岸线网络安全资讯站
@ChangeServiceConfig2A := GetProcAddress(hDLL, ChangeServiceConfig2A);cjn海岸线网络安全资讯站
@ChangeServiceConfig2W := GetProcAddress(hDLL, ChangeServiceConfig2W);cjn海岸线网络安全资讯站
@ChangeServiceConfig2 := @ChangeServiceConfig2A;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
endcjn海岸线网络安全资讯站
elsecjn海岸线网络安全资讯站
begincjn海岸线网络安全资讯站
@QueryServiceConfig2A := nil;cjn海岸线网络安全资讯站
@QueryServiceConfig2W := nil;cjn海岸线网络安全资讯站
@QueryServiceConfig2 := nil;cjn海岸线网络安全资讯站
@ChangeServiceConfig2A := nil;cjn海岸线网络安全资讯站
@ChangeServiceConfig2W := nil;cjn海岸线网络安全资讯站
@ChangeServiceConfig2 := nil;cjn海岸线网络安全资讯站
end;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
finalizationcjn海岸线网络安全资讯站
if (hDLL <> 0) and LibLoaded thencjn海岸线网络安全资讯站
FreeLibrary(hDLL);cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
end.cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
unit winntService;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
interfacecjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
usescjn海岸线网络安全资讯站
Windows,WinSvc,WinSvcEx;cjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean;cjn海岸线网络安全资讯站
//eg:InstallService(服务名称,显示名称,描述信息,服务文件);cjn海岸线网络安全资讯站
procedure UninstallService(strServiceName:string);cjn海岸线网络安全资讯站
implementationcjn海岸线网络安全资讯站
cjn海岸线网络安全资讯站
function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;cjn海岸线网络安全资讯站
asmcjn海岸线网络安全资讯站
PUSH EDIcjn海岸线网络安全资讯站
PUSH ESIcjn海岸线网络安全资讯站
PUSH EBXcjn海岸线网络安全资讯站
MOV ESI,EAXcjn海岸线网络安全资讯站
MOV EDI,EDXcjn海岸线网络安全资讯站
MOV EBX,ECXcjn海岸线网络安全资讯站
XOR AL,ALcjn海岸线网络安全资讯站
TEST ECX,ECXcjn海岸线网络安全资讯站
JZ @@1cjn海岸线网络安全资讯站
REPNE SCASBcjn海岸线网络安全资讯站
JNE @@1cjn海岸线网络安全资讯站
INC ECXcjn海岸线网络安全资讯站
@@1: SUB EBX,ECXcjn海岸线网络安全资讯站
MOV EDI,ESIcjn海岸线网络安全资讯站
MOV ESI,EDXcjn海岸线网络安全资讯站
MOV EDX,EDIcjn海岸线网络安全资讯站
MOV ECX,EBXcjn海岸线网络安全资讯站
SHR ECX,2cjn海岸线网络安全资讯站
REP MOVSDcjn海岸线网络安全资讯站
MOV ECX,EBXcjn海岸线网络安全资讯站
AND ECX,3cjn海岸线网络安全资讯站
REP MOVSBcjn海岸线网络安全资讯站
STOSBcjn海岸线网络安全资讯站
MOV EAX,EDXcjn海岸线网络安全资讯站
POP EBXcjn海岸线网络安全资讯站
POP ESI