dll的代码如下:
library GetServicesStatus;
uses
SysUtils,
WinSvc,
Classes;{$R *.res}
Function GetServicesStatusString(sServiceName:string):String;stdcall;
var
hService, hSCManager: SC_HANDLE;
SS: TServiceStatus;
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if hSCManager = 0 then
begin
result := 'Can not open the service control manager';
exit;
end;
hService :=OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS);
if hService = 0 then
begin
CloseServiceHandle(hSCManager);
result := 'Can not open the service(' + sServiceName + ')';
exit;
end;
if not QueryServiceStatus(hService, SS) then
result := 'Can not query the service status'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
result := 'The service(' + sServiceName + ') continue is pending';
SERVICE_PAUSE_PENDING:
result := 'The service(' + sServiceName + ') pause is pending.';
SERVICE_PAUSED:
result := 'The service(' + sServiceName + ') is paused.';
SERVICE_RUNNING:
result := ' ' + sServiceName + ' 正在运行';
SERVICE_START_PENDING:
result := ' ' + sServiceName + ' 正在启动';
SERVICE_STOP_PENDING:
result := ' ' + sServiceName + ' 正在停止';
SERVICE_STOPPED:
result := ' ' + sServiceName + ' 已经停止';
else
result := ' 未知状态';
end;
end;
CloseServiceHandle(hSCManager);
CloseServiceHandle(hService);
End;
/////////////////////////
Function GetServicesStatusInt(sServiceName:string):Integer;stdcall;
var
hService, hSCManager: SC_HANDLE;
SS: TServiceStatus;
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if hSCManager = 0 then
begin
result := 0;
exit;
end;
hService :=OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS);
if hService = 0 then
begin
CloseServiceHandle(hSCManager);
result := 1;//'Can not open the service(' + sServiceName + ')';
exit;
end;
if not QueryServiceStatus(hService, SS) then
result := 2 //'Can not query the service status'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
result := 3;//'The service(' + sServiceName + ') continue is pending';
SERVICE_PAUSE_PENDING:
result := 4;//'The service(' + sServiceName + ') pause is pending.';
SERVICE_PAUSED:
result := 5;//'The service(' + sServiceName + ') is paused.';
SERVICE_RUNNING:
result := 6;//' ' + sServiceName + ' 正在运行';
SERVICE_START_PENDING:
result := 7;//' ' + sServiceName + ' 正在启动';
SERVICE_STOP_PENDING:
result := 8;//' ' + sServiceName + ' 正在停止';
SERVICE_STOPPED:
result := 9;//' ' + sServiceName + ' 已经停止';
else
result := 10;//' 未知状态';
end;
end;
CloseServiceHandle(hSCManager);
CloseServiceHandle(hService);
End;exports
GetServicesStatusString,
GetServicesStatusInt;
begin
end.调用时如下:procedure TForm1.FormShow(Sender: TObject);
begin
ListBox1.Items.Add(DateTimeToStr(Now)+' 程序目录'+ExtractFilePath(Application.Exename));
ListBox1.Items.Add(DateTimeToStr(Now)+' 程序启动成功');
ListBox1.Items.Add(DateTimeToStr(Now)+' 服务'+GetServicesStatusString('mysql'));
ListBox1.Items.Add(DateTimeToStr(Now)+' 服务'+GetServicesStatusString('apache2.2'));
end;运行时出错:invalid pointer operation但去掉ListBox1.Items.Add(DateTimeToStr(Now)+' 服务'+GetServicesStatusString('apache2.2'));后就正常
library GetServicesStatus;
uses
SysUtils,
WinSvc,
Classes;{$R *.res}
Function GetServicesStatusString(sServiceName:string):String;stdcall;
var
hService, hSCManager: SC_HANDLE;
SS: TServiceStatus;
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if hSCManager = 0 then
begin
result := 'Can not open the service control manager';
exit;
end;
hService :=OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS);
if hService = 0 then
begin
CloseServiceHandle(hSCManager);
result := 'Can not open the service(' + sServiceName + ')';
exit;
end;
if not QueryServiceStatus(hService, SS) then
result := 'Can not query the service status'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
result := 'The service(' + sServiceName + ') continue is pending';
SERVICE_PAUSE_PENDING:
result := 'The service(' + sServiceName + ') pause is pending.';
SERVICE_PAUSED:
result := 'The service(' + sServiceName + ') is paused.';
SERVICE_RUNNING:
result := ' ' + sServiceName + ' 正在运行';
SERVICE_START_PENDING:
result := ' ' + sServiceName + ' 正在启动';
SERVICE_STOP_PENDING:
result := ' ' + sServiceName + ' 正在停止';
SERVICE_STOPPED:
result := ' ' + sServiceName + ' 已经停止';
else
result := ' 未知状态';
end;
end;
CloseServiceHandle(hSCManager);
CloseServiceHandle(hService);
End;
/////////////////////////
Function GetServicesStatusInt(sServiceName:string):Integer;stdcall;
var
hService, hSCManager: SC_HANDLE;
SS: TServiceStatus;
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if hSCManager = 0 then
begin
result := 0;
exit;
end;
hService :=OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS);
if hService = 0 then
begin
CloseServiceHandle(hSCManager);
result := 1;//'Can not open the service(' + sServiceName + ')';
exit;
end;
if not QueryServiceStatus(hService, SS) then
result := 2 //'Can not query the service status'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
result := 3;//'The service(' + sServiceName + ') continue is pending';
SERVICE_PAUSE_PENDING:
result := 4;//'The service(' + sServiceName + ') pause is pending.';
SERVICE_PAUSED:
result := 5;//'The service(' + sServiceName + ') is paused.';
SERVICE_RUNNING:
result := 6;//' ' + sServiceName + ' 正在运行';
SERVICE_START_PENDING:
result := 7;//' ' + sServiceName + ' 正在启动';
SERVICE_STOP_PENDING:
result := 8;//' ' + sServiceName + ' 正在停止';
SERVICE_STOPPED:
result := 9;//' ' + sServiceName + ' 已经停止';
else
result := 10;//' 未知状态';
end;
end;
CloseServiceHandle(hSCManager);
CloseServiceHandle(hService);
End;exports
GetServicesStatusString,
GetServicesStatusInt;
begin
end.调用时如下:procedure TForm1.FormShow(Sender: TObject);
begin
ListBox1.Items.Add(DateTimeToStr(Now)+' 程序目录'+ExtractFilePath(Application.Exename));
ListBox1.Items.Add(DateTimeToStr(Now)+' 程序启动成功');
ListBox1.Items.Add(DateTimeToStr(Now)+' 服务'+GetServicesStatusString('mysql'));
ListBox1.Items.Add(DateTimeToStr(Now)+' 服务'+GetServicesStatusString('apache2.2'));
end;运行时出错:invalid pointer operation但去掉ListBox1.Items.Add(DateTimeToStr(Now)+' 服务'+GetServicesStatusString('apache2.2'));后就正常
解决方案 »
- Delphi 定时清理内存的方法?
- 关于过程调用的问题,带参数。帮忙解答
- 有关delphi几个版本的选择问题
- 有没有广州的DELPHI高手啊?我有几个小软件要做做.
- 请教一个对于接受到的数据的处理的问题
- 如何取得当前IE窗口的标题栏和当前url信息?
- 请问如何在资源管理器的右键菜单中添加一项
- delphi如何实现 【新浪微博 登陆 和 关注他人】
- 我想在 WebBrowser 控件显示一段脚本(不生成临时文件),如何解决
- 一个问题,也是关于打印的,对与熟悉DELPHI的应该很简单,大给分
- 急需一个中学学生管理系统的数据结构或数据分析???????????
- 我用ADO连接access,access不支持临时表吗
SysUtils,
WinSvc,
Classes; 修改成:uses
ShareMem,
SysUtils,
WinSvc,
Classes; 后重新测试一下。
uses
ShareMem,
SysUtils,
WinSvc,
Classes; 但有同样的错误
freelibrary
试试