我如何知道win2000中所有的服务,就像计算机管理中服务所显示的那样。我知道可以通过读取注册表得到这些信息,还有没有其他办法?望各位高手指教。
解决方案 »
- delphi中RzCheckTree控件的使用............
- C/S IDtcpclient向IDtcpserver發送數據,在listview上面顯示?
- 消息事件机制与操作系统有什么关系?
- 98中编程修改IP地址-急
- 打印问题,非常急
- [讨论一下]websnap的数据库字段问题的菜鸟级解决方案~同时征询您的方案~
- 请问哪儿可以买到<<Delphi 5.X ADO MTS COM+高级程序设计篇>>这本书?
- 程序运行一段时间后,有的Label、Panel上的 Caption或者Button消失了,但能正常操作?
- 200分在线求助简单的问题,来者有分!特别欢迎qiqi97(小菜弟) 和: wylove(阿刚)再次指教。
- 非常容易得分得问题
- 散分!做了一個網路電話,兄弟幫忙測試一下,
- 关于clientdataset的问题。
SC_HANDLE hSCManager, // handle to service control manager database
DWORD dwServiceType, // type of services to enumerate
DWORD dwServiceState, // state of services to enumerate
LPENUM_SERVICE_STATUS lpServices,
// pointer to service status buffer
DWORD cbBufSize, // size of service status buffer
LPDWORD pcbBytesNeeded, // pointer to variable for bytes needed
LPDWORD lpServicesReturned,
// pointer to variable for number returned
LPDWORD lpResumeHandle // pointer to variable for next entry
);它是从advapi32.dll中引出的,但是我在delphi的source中没找到。
你再找找看吧,或者自己声明一下。
若我有时间也好好研究下。
只好你自己声明了~~
里面有所有的win32api声明,
上面那个函数在JwaWinSvc.pas单元里
unit UserWinSvc;interfaceuses
WinSvc, Windows;type _SC_ENUM_TYPE = (
SC_ENUM_PROCESS_INFO = 0
);
SC_ENUM_TYPE = _SC_ENUM_TYPE; _SC_STATUS_TYPE = (
SC_STATUS_PROCESS_INFO = 0
);
SC_STATUS_TYPE = _SC_STATUS_TYPE; _SERVICE_STATUS_PROCESS = record
dwServiceType: DWORD;
dwCurrentState: DWORD;
dwControlsAccepted: DWORD;
dwWin32ExitCode: DWORD;
dwServiceSpecificExitCode: DWORD;
dwCheckPoint: DWORD;
dwWaitHint: DWORD;
dwProcessId: DWORD;
dwServiceFlags: DWORD;
end;
SERVICE_STATUS_PROCESS = _SERVICE_STATUS_PROCESS;
LPSERVICE_STATUS_PROCESS = ^_SERVICE_STATUS_PROCESS; _ENUM_SERVICE_STATUS_PROCESS = record
lpServiceName: LPTSTR;
lpDisplayName: LPTSTR;
ServiceStatusProcess: SERVICE_STATUS_PROCESS;
end;
ENUM_SERVICE_STATUS_PROCESS = _ENUM_SERVICE_STATUS_PROCESS;
LPENUM_SERVICE_STATUS_PROCESS = ^_ENUM_SERVICE_STATUS_PROCESS; LPBYTE = PChar;function EnumServicesStatusEx(
hSCManager: SC_HANDLE; // handle to SCM database
InfoLevel: SC_ENUM_TYPE; // information level
dwServiceType: DWORD; // service type
dwServiceState: DWORD; // service state
lpServices: LPBYTE; // status buffer
cbBufSize: DWORD; // size of status buffer
pcbBytesNeeded: LPDWORD; // buffer size needed
lpServicesReturned: LPDWORD; // number of entries returned
lpResumeHandle: LPDWORD; // next entry
pszGroupName: LPCTSTR // load-order group name
): BOOL; stdcall;function QueryServiceStatusEx(
hService: SC_HANDLE; // handle to service
InfoLevel: SC_STATUS_TYPE; // information level
lpBuffer: LPBYTE; // buffer
cbBufSize: DWORD; // size of buffer
var pcbBytesNeeded: DWORD // bytes needed
): BOOL; stdcall;implementationconst
advapi32 = 'advapi32.dll';function EnumServicesStatusEx; external advapi32 name 'EnumServicesStatusExA';
function QueryServiceStatusEx; external advapi32 name 'QueryServiceStatusEx';end.
//=========================================================
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, ActnList, ImgList, Buttons, ToolWin,
StdCtrls, WinSvc, UserWinSvc, Menus;type
TMainFrm = class(TForm)
Bevel1: TBevel;
SvcListView: TListView;
EdtMachine: TEdit;
ToolBar1: TToolBar;
SpeedButton1: TSpeedButton;
ImageList1: TImageList;
ActionList1: TActionList;
ActionStart: TAction;
ActionPause: TAction;
ActionStop: TAction;
ActionContinue: TAction;
ActionRestart: TAction;
ActionRefresh: TAction;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
SpeedButton2: TSpeedButton;
STCBox: TComboBox;
MacChkBox: TCheckBox;
PopupMenu1: TPopupMenu;
ActionRestart1: TMenuItem;
ActionPause1: TMenuItem;
ActionStop1: TMenuItem;
ActionRefresh1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
procedure SpeedButton1Click(Sender: TObject);
procedure ActionStartExecute(Sender: TObject);
procedure ActionPauseExecute(Sender: TObject);
procedure ActionStopExecute(Sender: TObject);
procedure ActionContinueExecute(Sender: TObject);
procedure ActionRestartExecute(Sender: TObject);
procedure ActionRefreshExecute(Sender: TObject);
procedure SvcListViewSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure MacChkBoxClick(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure STCBoxSelect(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
SvrName: string;
ServiceType: Integer;
SelectItem: TListItem;
procedure ListServices(schSCManager: SC_HANDLE; ServiceType: Integer);
function SrvStatus(ServiceStatus: DWORD): string;
function QueryServiceStatu(const Svchandle: SC_HANDLE): String;
public
{ Public declarations }
end;var
MainFrm: TMainFrm;implementationuses U_Sys;{$R *.dfm}procedure TMainFrm.SpeedButton1Click(Sender: TObject);
begin
if SvcMgr > 0 then
CloseServiceHandle(SvcMgr);
if EdtMachine.Enabled then
SvcMgr := OpenSCManager(Pchar(EdtMachine.Text),nil,SC_MANAGER_ALL_ACCESS)
else
SvcMgr := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if SvcMgr <= 0 then
begin
P_ShowError('开启服务失败,错误:'+IntToStr(GetLastError));
Caption := '开启服务失败';
end else begin
if EdtMachine.Enabled then
Caption := '连接'+EdtMachine.Text+'服务'
else
Caption := '连接本地服务';
ListServices(SvcMgr, ServiceType);
end;
end;procedure TMainFrm.ActionStartExecute(Sender: TObject);
var
Svc: SC_HANDLE;
tmpPChar: PChar;
begin
if SvrName = '' then
begin
P_ShowInfo('请先选择服务!');
Exit;
end;
if SvcMgr > 0 then
begin
Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
if Svc <= 0 then
begin
P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
Exit;
end;
try
if not StartService(Svc,0,tmpPChar) then
begin
P_ShowError('启动服务失败,错误:'+IntToStr(GetLastError));
end else begin
SelectItem.SubItems[2] := QueryServiceStatu(Svc);
end;
finally
CloseServiceHandle(Svc);
end;
end else begin
P_ShowInfo('请先连接所要管理机器!');
end;
end;procedure TMainFrm.ActionPauseExecute(Sender: TObject);
var
Svc: SC_HANDLE;
tmpSS: TServiceStatus;
begin
if SvrName = '' then
begin
P_ShowInfo('请先选择服务!');
Exit;
end;
if SvcMgr > 0 then
begin
Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
if Svc <= 0 then
begin
P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
Exit;
end;
try
if not ControlService(Svc,SERVICE_CONTROL_PAUSE,tmpSS) then
begin
P_ShowError('暂停服务失败,错误:'+IntToStr(GetLastError));
end else begin
SelectItem.SubItems[2] := QueryServiceStatu(Svc);
end;
finally
CloseServiceHandle(Svc);
end;
end else begin
P_ShowInfo('请先连接所要管理机器!');
end;
end;procedure TMainFrm.ActionStopExecute(Sender: TObject);
var
Svc: SC_HANDLE;
tmpSS: TServiceStatus;
begin
if SvrName = '' then
begin
P_ShowInfo('请先选择服务!');
Exit;
end;
if SvcMgr > 0 then
begin
Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
if Svc <= 0 then
begin
P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
Exit;
end;
try
if not ControlService(Svc,SERVICE_CONTROL_STOP,tmpSS) then
begin
P_ShowError('停止服务失败,错误:'+IntToStr(GetLastError));
end else begin
SelectItem.SubItems[2] := QueryServiceStatu(Svc);
end;
finally
CloseServiceHandle(Svc);
end;
end else begin
P_ShowInfo('请先连接所要管理机器!');
end;
end;
var
Svc: SC_HANDLE;
tmpSS: TServiceStatus;
begin
if SvrName = '' then
begin
P_ShowInfo('请先选择服务!');
Exit;
end;
if SvcMgr > 0 then
begin
Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
if Svc <= 0 then
begin
P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
Exit;
end;
try
if not ControlService(Svc,SERVICE_CONTROL_CONTINUE,tmpSS) then
begin
P_ShowError('继续服务失败,错误:'+IntToStr(GetLastError));
end else begin
SelectItem.SubItems[2] := QueryServiceStatu(Svc);
end;
finally
CloseServiceHandle(Svc);
end;
end else begin
P_ShowInfo('请先连接所要管理机器!');
end;
end;procedure TMainFrm.ActionRestartExecute(Sender: TObject);
var
Svc: SC_HANDLE;
tmpPChar: PChar;
tmpSS: TServiceStatus;
begin
if SvrName = '' then
begin
P_ShowInfo('请先选择服务!');
Exit;
end;
if SvcMgr > 0 then
begin
Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
if Svc <= 0 then
begin
P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
Exit;
end;
try
if not ControlService(Svc,SERVICE_CONTROL_STOP,tmpSS) then
P_ShowError('停止服务失败,错误:'+IntToStr(GetLastError));
if not StartService(Svc,0,tmpPChar) then
P_ShowError('启动服务失败,错误:'+IntToStr(GetLastError));
SelectItem.SubItems[2] := QueryServiceStatu(Svc);
finally
CloseServiceHandle(Svc);
end;
end else begin
P_ShowInfo('请先连接所要管理机器!');
end;
end;procedure TMainFrm.ActionRefreshExecute(Sender: TObject);
var
Svc: SC_HANDLE;
tmpSS: TServiceStatus;
begin
if SvrName = '' then
begin
P_ShowInfo('请先选择服务!');
Exit;
end;
if SvcMgr > 0 then
begin
Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
if Svc <= 0 then
begin
P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
Exit;
end;
try
if not ControlService(Svc,SERVICE_CONTROL_INTERROGATE,tmpSS) then
begin
P_ShowError('刷新服务失败,错误:'+IntToStr(GetLastError));
end else begin
SelectItem.SubItems[2] := QueryServiceStatu(Svc);
end;
finally
CloseServiceHandle(Svc);
end;
end else begin
P_ShowInfo('请先连接所要管理机器!');
end;
end;procedure TMainFrm.SvcListViewSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
SelectItem := Item;
SvrName := Item.Caption;
end;procedure TMainFrm.ListServices(schSCManager: SC_HANDLE; ServiceType: Integer);
var
lpServices: LPBYTE;
n,nSize,npSize,nServicesReturned,nResumeHandle,dwServiceType:DWORD;
ListItem: TListItem;
begin
if schSCManager > 0 then
begin
nResumeHandle := 0;
npSize := Sizeof(ENUM_SERVICE_STATUS_PROCESS);
if ServiceType > STCBox.Items.Count-1 then
begin
dwServiceType := SERVICE_WIN32;
end else begin
dwServiceType := ServiceType;
end; lpServices := LPBYTE(LocalAlloc(LPTR, 30720));
try
if not EnumServicesStatusEx(schSCManager, SC_ENUM_PROCESS_INFO,
dwServiceType, SERVICE_STATE_ALL, lpServices, 30720,
@nSize, @nServicesReturned,@nResumeHandle, nil) then
begin
P_ShowError('读取服务状态失败,错误:'+IntToStr(GetLastError));
Exit;
end; for n := 0 to nServicesReturned-1 do
begin
//Show the name of service
ListItem := SvcListView.Items.Add;
ListItem.Caption := (LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.lpServiceName;
ListItem.SubItems.Add((LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.lpDisplayName);
ListItem.SubItems.Add(IntToStr((LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.ServiceStatusProcess.dwProcessId));
ListItem.SubItems.Add(SrvStatus((LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.ServiceStatusProcess.dwCurrentState));
Inc(lpServices, npSize);
end;
finally
if lpServices <> nil then
LocalFree(Integer(lpServices));
end;
end;
end;procedure TMainFrm.MacChkBoxClick(Sender: TObject);
begin
EdtMachine.Enabled := MacChkBox.Checked;
if not MacChkBox.Checked then
EdtMachine.Text := 'LocalHost';
end;procedure TMainFrm.SpeedButton2Click(Sender: TObject);
begin
ListServices(SvcMgr, ServiceType);
end;function TMainFrm.SrvStatus(ServiceStatus: DWORD): string;
begin
case ServiceStatus of
SERVICE_STOPPED: result := '停止';
SERVICE_START_PENDING: result := '启动中';
SERVICE_STOP_PENDING: result := '停止中';
SERVICE_RUNNING: result := '运行';
SERVICE_CONTINUE_PENDING: result := '继续运行中';
SERVICE_PAUSE_PENDING: result := '暂停中';
SERVICE_PAUSED: result := '暂停';
else
result := '未知状态';
end;
end;procedure TMainFrm.STCBoxSelect(Sender: TObject);
begin
case STCBox.ItemIndex of
0 : ServiceType := SERVICE_WIN32;
1 : ServiceType := SERVICE_DRIVER;
2 : ServiceType := SERVICE_KERNEL_DRIVER;
3 : ServiceType := SERVICE_FILE_SYSTEM_DRIVER;
4 : ServiceType := SERVICE_WIN32_OWN_PROCESS;
5 : ServiceType := SERVICE_WIN32_SHARE_PROCESS;
6 : ServiceType := SERVICE_WIN32 or SERVICE_DRIVER or
SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS;
else
ServiceType := SERVICE_WIN32;
end;
end;procedure TMainFrm.FormCreate(Sender: TObject);
begin
SvcMgr := 0;
SvcListView.Items.Clear;
MacChkBoxClick(Sender);
STCBoxSelect(Sender);
end;procedure TMainFrm.FormDestroy(Sender: TObject);
begin
if SvcMgr > 0 then
CloseServiceHandle(SvcMgr);
end;function TMainFrm.QueryServiceStatu(const Svchandle: SC_HANDLE): String;
var
tmpSS: SERVICE_STATUS_PROCESS;
n, nSize: DWORD;
begin
Result := '未知';
if Svchandle > 0 then
begin
n := SizeOf(SERVICE_STATUS_PROCESS);
if QueryServiceStatusEx(Svchandle, SC_STATUS_PROCESS_INFO, LPBYTE(@tmpSS), n, nSize) then
begin
Result := SrvStatus(tmpSS.dwCurrentState);
end else begin
P_ShowError('读取'+SvrName+'服务失败,错误: '+IntToStr(GetLastError));
end;
end;
end;end.