日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi 写服务程序

發布時間:2025/7/25 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi 写服务程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

如何用 Delphi 創建系統服務程序?

Windows 2000/XP和2003等支持一種叫做"服務程序"的東西.程序作為服務啟動有以下幾個好處:

?

(1)不用登陸進系統即可運行.

(2)具有SYSTEM特權.所以你在進程管理器里面是無法結束它的.

?

筆者在2003年為一公司開發機頂盒項目的時候,曾經寫過課件上傳和媒體服務,下面就介紹一下如何用Delphi7創建一個Service程序.

運行Delphi7,選擇菜單File-->New-->Other--->Service Application.將生成一個服務程序的框架.將工程保存為ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我們注意到,Service有幾個屬性.其中以下幾個是我們比較常用的:

?

(1)DisplayName:服務的顯示名稱

(2)Name:服務名稱.

?

我們在這里將DisplayName的值改為"Delphi服務演示程序",Name改為"DelphiService".編譯這個項目,將得到 ServiceDemo.exe.這已經是一個服務程序了!進入CMD模式,切換致工程所在目錄,運行命令"ServiceDemo.exe /install",將提示服務安裝成功!然后"net start DelphiService"將啟動這個服務.進入控制面版-->管理工具-->服務,將顯示這個服務和當前狀態.不過這個服務現在什么也干不了,因為我們還沒有寫代碼:)先"net stop DelphiService"停止再"ServiceDemo.exe /uninstall"刪除這個服務.回到Delphi7的IDE.

?

我們的計劃是為這個服務添加一個主窗口,運行后任務欄顯示程序的圖標,雙擊圖標將顯示主窗口,上面有一個按鈕,點擊該按鈕將實現Ctrl+Alt+Del功能.

?

實際上,服務程序莫認是工作于Winlogon桌面的,可以打開控制面板,查看我們剛才那個服務的屬性-->登陸,其中"允許服務與桌面交互 "是不打鉤的.怎么辦?呵呵,回到IDE,注意那個布爾屬性:Interactive,當這個屬性為True的時候,該服務程序就可以與桌面交互了.

?

File-->New-->Form為服務添加窗口FrmMain,單元保存為Unit_FrmMain,并且把這個窗口設置為手工創建.完成后的代碼如下:

?

view sourceprint?
01unit Unit_Main;
02??
03interface
04??
05uses
06Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Unit_FrmMain;
07??
08type
09TDelphiService = class(TService)
10procedure ServiceContinue(Sender: TService; var Continued: Boolean);
11procedure ServiceExecute(Sender: TService);
12procedure ServicePause(Sender: TService; var Paused: Boolean);
13procedure ServiceShutdown(Sender: TService);
14procedure ServiceStart(Sender: TService; var Started: Boolean);
15procedure ServiceStop(Sender: TService; var Stopped: Boolean);
16private
17{ Private declarations }
18public
19function GetServiceController: TServiceController; override;
20{ Public declarations }
21end;
22??
23var
24DelphiService: TDelphiService;
25FrmMain: TFrmMain;
26implementation
27??
28{$R *.DFM}
29??
30procedure ServiceController(CtrlCode: DWord); stdcall;
31begin
32DelphiService.Controller(CtrlCode);
33end;
34??
35function TDelphiService.GetServiceController: TServiceController;
36begin
37Result := ServiceController;
38end;
39??
40procedure TDelphiService.ServiceContinue(Sender: TService;
41var Continued: Boolean);
42begin
43while not Terminated do
44begin
45Sleep(10);
46ServiceThread.ProcessRequests(False);
47end;
48end;
49??
50procedure TDelphiService.ServiceExecute(Sender: TService);
51begin
52while not Terminated do
53begin
54Sleep(10);
55ServiceThread.ProcessRequests(False);
56end;
57end;
58??
59procedure TDelphiService.ServicePause(Sender: TService;
60var Paused: Boolean);
61begin
62Paused := True;
63end;
64??
65procedure TDelphiService.ServiceShutdown(Sender: TService);
66begin
67gbCanClose := true;
68FrmMain.Free;
69Status := csStopped;
70ReportStatus();
71end;
72??
73procedure TDelphiService.ServiceStart(Sender: TService;
74var Started: Boolean);
75begin
76Started := True;
77Svcmgr.Application.CreateForm(TFrmMain, FrmMain);
78gbCanClose := False;
79FrmMain.Hide;
80end;
81??
82procedure TDelphiService.ServiceStop(Sender: TService;
83var Stopped: Boolean);
84begin
85Stopped := True;
86gbCanClose := True;
87FrmMain.Free;
88end;
89??
90end.

?

主窗口單元如下:

?

view sourceprint?
001unit Unit_FrmMain;
002??
003interface
004??
005uses
006Windows, Messages, SysUtils, Variants, Classes, ShellApi, Graphics, Controls, Forms,
007Dialogs, ExtCtrls, StdCtrls;
008??
009const
010WM_TrayIcon = WM_USER + 1234;
011type
012TFrmMain = class(TForm)
013Timer1: TTimer;
014Button1: TButton;
015procedure FormCreate(Sender: TObject);
016procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
017procedure FormDestroy(Sender: TObject);
018procedure Timer1Timer(Sender: TObject);
019procedure Button1Click(Sender: TObject);
020private
021{ Private declarations }
022IconData: TNotifyIconData;
023procedure AddIconToTray;
024procedure DelIconFromTray;
025procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;
026procedure SysButtonMsg(var Msg: TMessage); message WM_SYSCOMMAND;
027public
028{ Public declarations }
029end;
030??
031var
032FrmMain: TFrmMain;
033gbCanClose: Boolean;
034implementation
035??
036{$R *.dfm}
037??
038procedure TFrmMain.FormCreate(Sender: TObject);
039begin
040FormStyle := fsStayOnTop;
041SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
042gbCanClose := False;
043Timer1.Interval := 1000;
044Timer1.Enabled := True;
045end;
046??
047procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
048begin
049CanClose := gbCanClose;
050if not CanClose then
051begin
052Hide;
053end;
054end;
055??
056procedure TFrmMain.FormDestroy(Sender: TObject);
057begin
058Timer1.Enabled := False;
059DelIconFromTray;
060end;
061??
062procedure TFrmMain.AddIconToTray;
063begin
064ZeroMemory(@IconData, SizeOf(TNotifyIconData));
065IconData.cbSize := SizeOf(TNotifyIconData);
066IconData.Wnd := Handle;
067IconData.uID := 1;
068IconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
069IconData.uCallbackMessage := WM_TrayIcon;
070IconData.hIcon := Application.Icon.Handle;
071IconData.szTip := Delphi服務演示程序;
072Shell_NotifyIcon(NIM_ADD, @IconData);
073end;
074??
075procedure TFrmMain.DelIconFromTray;
076begin
077Shell_NotifyIcon(NIM_DELETE, @IconData);
078end;
079??
080procedure TFrmMain.SysButtonMsg(var Msg: TMessage);
081begin
082if (Msg.wParam = SC_CLOSE) or
083(Msg.wParam = SC_MINIMIZE) then Hide
084else inherited; // 執行默認動作
085end;
086??
087procedure TFrmMain.TrayIconMessage(var Msg: TMessage);
088begin
089if (Msg.LParam = WM_LBUTTONDBLCLK) then Show();
090end;
091??
092procedure TFrmMain.Timer1Timer(Sender: TObject);
093begin
094AddIconToTray;
095end;
096??
097procedure SendHokKey;stdcall;
098var
099HDesk_WL: HDESK;
100begin
101HDesk_WL := OpenDesktop (Winlogon, 0, False, DESKTOP_JOURNALPLAYBACK);
102if (HDesk_WL <> 0) then
103if (SetThreadDesktop (HDesk_WL) = True) then
104PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG (MOD_ALT or MOD_CONTROL, VK_DELETE));
105end;
106??
107procedure TFrmMain.Button1Click(Sender: TObject);
108var
109dwThreadID : DWORD;
110begin
111CreateThread(nil, 0, @SendHokKey, nil, 0, dwThreadID);
112end;
113??
114end.

補充:

(1)關于更多服務程序的演示程序,請訪問以下 http://www.torry.net/pages.php?id=226 ,上面包含了多個演示如何控制和管理系統服務的代碼.

?

(2)請切記:Windows實際上存在多個桌面.例如屏幕傳輸會出現白屏,可能有兩個原因:一是系統處于鎖定或未登陸桌面,二是處于屏幕保護桌面.這時候要將當前桌面切換到該桌面才能抓屏.

?

(3)關于服務程序與桌面交互,還有種動態切換方法.大概單元如下:

view sourceprint?
01unit ServiceDesktop;
02??
03interface
04??
05function InitServiceDesktop: boolean;
06procedure DoneServiceDeskTop;
07??
08implementation
09??
10uses Windows, SysUtils;
11??
12const
13DefaultWindowStation = WinSta0;
14DefaultDesktop = Default;
15var
16hwinstaSave: HWINSTA;
17hdeskSave: HDESK;
18hwinstaUser: HWINSTA;
19hdeskUser: HDESK;
20function InitServiceDesktop: boolean;
21var
22dwThreadId: DWORD;
23begin
24dwThreadId := GetCurrentThreadID;
25// Ensure connection to service window station and desktop, and
26// save their handles.
27hwinstaSave := GetProcessWindowStation;
28hdeskSave := GetThreadDesktop(dwThreadId);
29??
30??
31hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);
32if hwinstaUser = 0 then
33begin
34OutputDebugString(PChar(OpenWindowStation failed + SysErrorMessage(GetLastError)));
35Result := false;
36exit;
37end;
38??
39if not SetProcessWindowStation(hwinstaUser) then
40begin
41OutputDebugString(SetProcessWindowStation failed);
42Result := false;
43exit;
44end;
45??
46hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);
47if hdeskUser = 0 then
48begin
49OutputDebugString(OpenDesktop failed);
50SetProcessWindowStation(hwinstaSave);
51CloseWindowStation(hwinstaUser);
52Result := false;
53exit;
54end;
55Result := SetThreadDesktop(hdeskUser);
56if not Result then
57OutputDebugString(PChar(SetThreadDesktop + SysErrorMessage(GetLastError)));
58end;
59??
60procedure DoneServiceDeskTop;
61begin
62// Restore window station and desktop.
63SetThreadDesktop(hdeskSave);
64SetProcessWindowStation(hwinstaSave);
65if hwinstaUser <> 0 then
66CloseWindowStation(hwinstaUser);
67if hdeskUser <> 0 then
68CloseDesktop(hdeskUser);
69end;
70??
71initialization
72InitServiceDesktop;
73finalization
74DoneServiceDesktop;
75end.

更詳細的演示代碼請參看: http://www.torry.net/samples/samples/os/isarticle.zip

?

(4)關于安裝服務如何添加服務描述.有兩種方法:一是修改注冊表.服務的詳細信息都位于HKEY_LOCAL_MACHINE\SYSTEM\ ControlSet001\Services\下面,例如我們剛才那個服務就位于HKEY_LOCAL_MACHINE\SYSTEM\ ControlSet001\Services\DelphiService下.第二種方法就是先用QueryServiceConfig2函數獲取服務信息,然后ChangeServiceConfig2來改變描述.用Delphi實現的話,單元如下:

view sourceprint?
001unit WinSvcEx;
002??
003interface
004??
005uses Windows, WinSvc;
006??
007const
008//
009// Service config info levels
010//
011SERVICE_CONFIG_DESCRIPTION = 1;
012SERVICE_CONFIG_FAILURE_ACTIONS = 2;
013//
014// DLL name of imported functions
015//
016AdvApiDLL = advapi32.dll;
017type
018//
019// Service description string
020//
021PServiceDescriptionA = ^TServiceDescriptionA;
022PServiceDescriptionW = ^TServiceDescriptionW;
023PServiceDescription = PServiceDescriptionA;
024{$EXTERNALSYM _SERVICE_DESCRIPTIONA}
025_SERVICE_DESCRIPTIONA = record
026lpDescription : PAnsiChar;
027end;
028{$EXTERNALSYM _SERVICE_DESCRIPTIONW}
029_SERVICE_DESCRIPTIONW = record
030lpDescription : PWideChar;
031end;
032{$EXTERNALSYM _SERVICE_DESCRIPTION}
033_SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
034{$EXTERNALSYM SERVICE_DESCRIPTIONA}
035SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA;
036{$EXTERNALSYM SERVICE_DESCRIPTIONW}
037SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW;
038{$EXTERNALSYM SERVICE_DESCRIPTION}
039SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
040TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
041TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
042TServiceDescription = TServiceDescriptionA;
043??
044//
045// Actions to take on service failure
046//
047{$EXTERNALSYM _SC_ACTION_TYPE}
048_SC_ACTION_TYPE = (SC_ACTION_NONE, SC_ACTION_RESTART, SC_ACTION_REBOOT, SC_ACTION_RUN_COMMAND);
049{$EXTERNALSYM SC_ACTION_TYPE}
050SC_ACTION_TYPE = _SC_ACTION_TYPE;
051??
052PServiceAction = ^TServiceAction;
053{$EXTERNALSYM _SC_ACTION}
054_SC_ACTION = record
055aType : SC_ACTION_TYPE;
056Delay : DWORD;
057end;
058{$EXTERNALSYM SC_ACTION}
059SC_ACTION = _SC_ACTION;
060TServiceAction = _SC_ACTION;
061??
062PServiceFailureActionsA = ^TServiceFailureActionsA;
063PServiceFailureActionsW = ^TServiceFailureActionsW;
064PServiceFailureActions = PServiceFailureActionsA;
065{$EXTERNALSYM _SERVICE_FAILURE_ACTIONSA}
066_SERVICE_FAILURE_ACTIONSA = record
067dwResetPeriod : DWORD;
068lpRebootMsg : LPSTR;
069lpCommand : LPSTR;
070cActions : DWORD;
071lpsaActions : ^SC_ACTION;
072end;
073{$EXTERNALSYM _SERVICE_FAILURE_ACTIONSW}
074_SERVICE_FAILURE_ACTIONSW = record
075dwResetPeriod : DWORD;
076lpRebootMsg : LPWSTR;
077lpCommand : LPWSTR;
078cActions : DWORD;
079lpsaActions : ^SC_ACTION;
080end;
081{$EXTERNALSYM _SERVICE_FAILURE_ACTIONS}
082_SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
083{$EXTERNALSYM SERVICE_FAILURE_ACTIONSA}
084SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA;
085{$EXTERNALSYM SERVICE_FAILURE_ACTIONSW}
086SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW;
087{$EXTERNALSYM SERVICE_FAILURE_ACTIONS}
088SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
089TServiceFailureActionsA = _SERVICE_FAILURE_ACTIONSA;
090TServiceFailureActionsW = _SERVICE_FAILURE_ACTIONSW;
091TServiceFailureActions = TServiceFailureActionsA;
092??
093///
094// API Function Prototypes
095///
096TQueryServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpBuffer : pointer;
097cbBufSize : DWORD; var pcbBytesNeeded) : BOOL; stdcall;
098TChangeServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpInfo : pointer) : BOOL; stdcall;
099??
100var
101hDLL : THandle ;
102LibLoaded : boolean ;
103??
104var
105OSVersionInfo : TOSVersionInfo;
106??
107{$EXTERNALSYM QueryServiceConfig2A}
108QueryServiceConfig2A : TQueryServiceConfig2;
109{$EXTERNALSYM QueryServiceConfig2W}
110QueryServiceConfig2W : TQueryServiceConfig2;
111{$EXTERNALSYM QueryServiceConfig2}
112QueryServiceConfig2 : TQueryServiceConfig2;
113??
114{$EXTERNALSYM ChangeServiceConfig2A}
115ChangeServiceConfig2A : TChangeServiceConfig2;
116{$EXTERNALSYM ChangeServiceConfig2W}
117ChangeServiceConfig2W : TChangeServiceConfig2;
118{$EXTERNALSYM ChangeServiceConfig2}
119ChangeServiceConfig2 : TChangeServiceConfig2;
120??
121implementation
122??
123initialization
124OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
125GetVersionEx(OSVersionInfo);
126if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSVersionInfo.dwMajorVersion >= 5) then
127begin
128if hDLL = 0 then
129begin
130hDLL:=GetModuleHandle(AdvApiDLL);
131LibLoaded := False;
132if hDLL = 0 then
133begin
134hDLL := LoadLibrary(AdvApiDLL);
135LibLoaded := True;
136end;
137end;
138??
139if hDLL <> 0 then
140begin
141@QueryServiceConfig2A := GetProcAddress(hDLL, QueryServiceConfig2A);
142@QueryServiceConfig2W := GetProcAddress(hDLL, QueryServiceConfig2W);
143@QueryServiceConfig2 := @QueryServiceConfig2A;
144@ChangeServiceConfig2A := GetProcAddress(hDLL, ChangeServiceConfig2A);
145@ChangeServiceConfig2W := GetProcAddress(hDLL, ChangeServiceConfig2W);
146@ChangeServiceConfig2 := @ChangeServiceConfig2A;
147end;
148end
149else
150begin
151@QueryServiceConfig2A := nil;
152@QueryServiceConfig2W := nil;
153@QueryServiceConfig2 := nil;
154@ChangeServiceConfig2A := nil;
155@ChangeServiceConfig2W := nil;
156@ChangeServiceConfig2 := nil;
157end;
158??
159finalization
160if (hDLL <> 0) and LibLoaded then
161FreeLibrary(hDLL);
162??
163end.
164??
165unit winntService;
166??
167interface
168??
169uses
170Windows,WinSvc,WinSvcEx;
171??
172function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean;
173//eg:InstallService(服務名稱,顯示名稱,描述信息,服務文件);
174procedure UninstallService(strServiceName:string);
175implementation
176??
177function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
178asm
179PUSH EDI
180PUSH ESI
181PUSH EBX
182MOV ESI,EAX
183MOV EDI,EDX
184MOV EBX,ECX
185XOR AL,AL
186TEST ECX,ECX
187JZ @@1
188REPNE SCASB
189JNE @@1
190INC ECX
191@@1: SUB EBX,ECX
192MOV EDI,ESI
193MOV ESI,EDX
194MOV EDX,EDI
195MOV ECX,EBX
196SHR ECX,2
197REP MOVSD
198MOV ECX,EBX
199AND ECX,3
200REP MOVSB
201STOSB
202MOV EAX,EDX
203POP EBX
204POP ESI
205POP EDI
206end;
207??
208function StrPCopy(Dest: PChar; const Source: string): PChar;
209begin
210Result := StrLCopy(Dest, PChar(Source), Length(Source));
211end;
212??
213function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean;
214var
215//ss : TServiceStatus;
216//psTemp : PChar;
217hSCM,hSCS:THandle;
218??
219srvdesc : PServiceDescription;
220desc : string;
221//SrvType : DWord;
222??
223lpServiceArgVectors:pchar;
224begin
225Result:=False;
226//psTemp := nil;
227//SrvType := SERVICE_WIN32_OWN_PROCESS and SERVICE_INTERACTIVE_PROCESS;
228hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);//連接服務數據庫
229if hSCM=0 then Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),服務程序管理器,MB_ICONERROR+MB_TOPMOST);
230??
231??
232hSCS:=CreateService( //創建服務函數
233hSCM, // 服務控制管理句柄
234Pchar(strServiceName), // 服務名稱
235Pchar(strDisplayName), // 顯示的服務名稱
236SERVICE_ALL_ACCESS, // 存取權利
237SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,// 服務類型 SERVICE_WIN32_SHARE_PROCESS
238SERVICE_AUTO_START, // 啟動類型
239SERVICE_ERROR_IGNORE, // 錯誤控制類型
240Pchar(strFilename), // 服務程序
241nil, // 組服務名稱
242nil, // 組標識
243nil, // 依賴的服務
244nil, // 啟動服務帳號
245nil); // 啟動服務口令
246if hSCS=0 then Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),Pchar(Application.Title),MB_ICONERROR+MB_TOPMOST);
247??
248if Assigned(ChangeServiceConfig2) then
249begin
250desc := Copy(strDescription,1,1024);
251GetMem(srvdesc,SizeOf(TServiceDescription));
252GetMem(srvdesc^.lpDescription,Length(desc) + 1);
253try
254StrPCopy(srvdesc^.lpDescription, desc);
255ChangeServiceConfig2(hSCS,SERVICE_CONFIG_DESCRIPTION,srvdesc);
256finally
257FreeMem(srvdesc^.lpDescription);
258FreeMem(srvdesc);
259end;
260end;
261lpServiceArgVectors := nil;
262if not StartService(hSCS, 0, lpServiceArgVectors) then //啟動服務
263Exit; //MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),Pchar(Application.Title),MB_ICONERROR+MB_TOPMOST);
264CloseServiceHandle(hSCS); //關閉句柄
265Result:=True;
266end;
267??
268procedure UninstallService(strServiceName:string);
269var
270SCManager: SC_HANDLE;
271Service: SC_HANDLE;
272Status: TServiceStatus;
273begin
274SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
275if SCManager = 0 then Exit;
276try
277Service := OpenService(SCManager, Pchar(strServiceName), SERVICE_ALL_ACCESS);
278ControlService(Service, SERVICE_CONTROL_STOP, Status);
279DeleteService(Service);
280CloseServiceHandle(Service);
281finally
282CloseServiceHandle(SCManager);
283end;
284end;
285??
286end.

(5)如何暴力關閉一個服務程序,實現我們以前那個"NT工具箱"的功能?首先,根據進程名稱來殺死進程是用以下函數:

?

view sourceprint?
01uses Tlhelp32;
02??
03function KillTask(ExeFileName: string): Integer;
04const
05PROCESS_TERMINATE = 01;
06var
07ContinueLoop: BOOL;
08FSnapshotHandle: THandle;
09FProcessEntry32: TProcessEntry32;
10begin
11Result := 0;
12FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
13FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
14ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
15??
16while Integer(ContinueLoop) <> 0 do
17begin
18if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
19UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
20UpperCase(ExeFileName))) then
21Result := Integer(TerminateProcess(
22OpenProcess(PROCESS_TERMINATE,
23BOOL(0),
24FProcessEntry32.th32ProcessID),
250));
26ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
27end;
28CloseHandle(FSnapshotHandle);
29end;

但是對于服務程序,它會提示"拒絕訪問".其實只要程序擁有Debug權限即可:

?

view sourceprint?
01function EnableDebugPrivilege: Boolean;
02function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
03var
04TP: TOKEN_PRIVILEGES;
05Dummy: Cardinal;
06begin
07TP.PrivilegeCount := 1;
08LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);
09if bEnable then
10TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
11else TP.Privileges[0].Attributes := 0;
12AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
13Result := GetLastError = ERROR_SUCCESS;
14end;
15??
16var
17hToken: Cardinal;
18begin
19OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
20result:=EnablePrivilege(hToken, SeDebugPrivilege, True);
21CloseHandle(hToken);
22end;

?

使用方法:

view sourceprint?
1EnableDebugPrivilege;//提升權限
2??
3KillTask(xxxx.exe);//關閉該服務程序.

?

?

轉載于:https://www.cnblogs.com/ywangzi/archive/2011/10/24/2222850.html

總結

以上是生活随笔為你收集整理的Delphi 写服务程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。