本文整理自网络,侵删。
unit Demo;
interface
uses Windows, Forms, SysUtils, StdCtrls, WinSvc, Controls, Classes;
type
//Form for basic demo usage TForm6 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); end;
//Record defined for use as return buffer _SERVICE_STATUS_PROCESS = record dwServiceType: DWORD; dwCurrentState: DWORD; dwControlsAccepted: DWORD; dwWin32ExitCode: DWORD; dwServiceSpecificExitCode: DWORD; dwCheckPoint: DWORD; dwWaitHint: DWORD; dwProcessId: DWORD; dwServiceFlags: DWORD; end; //Function Prototype function QueryServiceStatusEx( SC_HANDLE: SC_Handle; SC_STATUS_TYPE: Cardinal; out lpBuffer: _SERVICE_STATUS_PROCESS; cbBufSize: DWORD; out pcbBytesNeeded: LPDWORD ): BOOL; stdcall;
//internal setup function function GetPid(sService: String; sMachine: String = '') : Cardinal;var Form6: TForm6;
implementation
{$R *.dfm}const // windows api library advapi32 = 'advapi32.dll'; //define the api call function QueryServiceStatusEx; external advapi32 name 'QueryServiceStatusEx';
//for demo usageprocedure TForm6.Button1Click(Sender: TObject);begin Memo1.Lines.Add(IntToStr(Integer(GetPid('Service'))))end;
function GetPid(sService: String; sMachine: String = '') : Cardinal;var schm, schs: SC_Handle; SC_STATUS_TYPE: Cardinal; lpBuffer: _SERVICE_STATUS_PROCESS; cbBufSize: DWORD; pcbBytesNeeded: LPDWORD;begin //open the service manager (defined in WinSvc) schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT); //set the status type to SC_STATUS_PROCESS_INFO //this is currently the only value supported SC_STATUS_TYPE := $00000000; //set the buffer size to the size of the record cbBufSize := sizeof(_SERVICE_STATUS_PROCESS); if (schm>0) then begin //grab the service handle schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS); if (schs>0) then begin //call the function QueryServiceStatusEx( schs, SC_STATUS_TYPE, lpBuffer, cbBufSize, pcbBytesNeeded); CloseServiceHandle(schs); end; CloseServiceHandle(schm); end; Result := lpBuffer.dwProcessId;end;
end.
相关阅读 >>
winapi 字符及字符串函数(7): ischarlower - 是否是个小写字母
更多相关阅读请进入《Delphi》频道 >>