如何得到sqlserver服务的运行或停止状态??

飞天凤凰601 2004-12-29 04:26:56
可以使用dos命令net stop mssqlserver停止(或启动)sqlserver服务器,但由于程序需要,想得到当时服务的状态,请问如何取得?
还有,可以使用delphi,而不去DOS命令(指SHELL等语句)来开启或停止系统服务吗?
...全文
182 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangxuan 2004-12-29
  • 打赏
  • 举报
回复
?

以下提供了三个简单易用函数,分别是启动,停止和得到服务状态,
以前按着MSDN上的代码转换过来,是阻塞型的,如想非阻塞型,
可考虑将代码放在线程中执行.

unit OperateService;
{
purpose: 操作Windows服务
}

interface

uses Windows, WinSvc;

//启动服务
function StartSampleService(const ServiceName: PAnsiChar): LongBool;

//停止服务
function StopSampleService(const ServiceName: PAnsiChar;
const fStopDependencies: LongBool; const dwTimeout: DWORD): LongBool;
//ServiceName - 服务名.
//fStopDependencies - 有依赖服务时,是否要停止.
//dwTimeout - 最大等待时间(毫秒)

//得到服务的状态
function GetSampleServiceStatus(const ServiceName: PAnsiChar; var
lpServiceStatus:
TServiceStatus): LongBool;

implementation

uses Variants;

function StartSampleService(const ServiceName: PAnsiChar): LongBool;
var
schSCManager, schService: SC_HANDLE;
ssStatus: TServiceStatus;
dwOldCheckPoint, dwStartTickCount, dwWaitTime: DWORD;

lpServiceArgVectors: Pchar;
begin
Result := False;

schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if schSCManager = 0 then
Exit;

schService := OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
if schService = 0 then
Exit;
try
lpServiceArgVectors := nil;
if not StartService(schService, 0, lpServiceArgVectors) then
Exit;

if not QueryServiceStatus(schService, ssStatus) then
Exit;

dwStartTickCount := GetTickCount;
dwOldCheckPoint := ssStatus.dwCheckPoint;

while ssStatus.dwCurrentState = SERVICE_START_PENDING do
begin
dwWaitTime := ssStatus.dwWaitHint div 10;
if dwWaitTime < 1000 then
dwWaitTime := 1000
else if dwWaitTime > 10000 then
dwWaitTime := 10000;

Sleep(dwWaitTime);

if not QueryServiceStatus(schService, ssStatus) then
Break;

if ssStatus.dwCheckPoint > dwOldCheckPoint then
begin
dwStartTickCount := GetTickCount;
dwOldCheckPoint := ssStatus.dwCheckPoint;
end
else if GetTickCount - dwStartTickCount > ssStatus.dwWaitHint then
Break;
end;

if ssStatus.dwCurrentState = SERVICE_RUNNING then
Result := True;
finally
CloseServiceHandle(schService);
end;
end;

function StopSampleService(const ServiceName: PAnsiChar;
const fStopDependencies: LongBool; const dwTimeout: DWORD): LongBool;
var
schSCManager, schService, hDepService: SC_HANDLE;
ssStatus: TServiceStatus;
dwStartTime: DWORD;
I, dwBytesNeeded, dwCount: DWORD;
lpDependencies: PEnumServiceStatus;
ess: TEnumServiceStatus;
begin
Result := False;
dwStartTime := GetTickCount;

schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);
if schSCManager = 0 then
Exit;

schService := OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
if schService = 0 then
Exit;

if not QueryServiceStatus(schService, ssStatus) then
Exit;

if ssStatus.dwCurrentState = SERVICE_STOPPED then
begin
Result := True;
Exit;
end;

while ssStatus.dwCurrentState = SERVICE_STOP_PENDING do
begin
Sleep(ssStatus.dwWaitHint);

if not QueryServiceStatus(schService, ssStatus) then
Exit;

if ssStatus.dwCurrentState = SERVICE_STOPPED then
begin
Result := True;
Exit;
end;

if (GetTickCount - dwStartTime > dwTimeout) then
Exit;
end;
if fStopDependencies then
begin
lpDependencies := nil;

if EnumDependentServices(schService, SERVICE_ACTIVE, lpDependencies^, 0,
dwBytesNeeded, dwCount) then
begin
end
else
begin
if GetLastError <> ERROR_MORE_DATA then
Exit;

lpDependencies := PEnumServiceStatus(HeapAlloc(GetProcessHeap,
0, dwBytesNeeded));

if not Assigned(lpDependencies) then
Exit;

try
if not EnumDependentServices(schService, SERVICE_ACTIVE,
lpDependencies^,
dwBytesNeeded, dwBytesNeeded, dwCount) then
Exit;

for I := 0 to dwCount - 1 do
begin
ess := lpDependencies^;
hDepService := OpenService(schSCManager, ess.lpServiceName,
SERVICE_STOP or
SERVICE_QUERY_STATUS);
if hDepService = 0 then
Exit;
try
if not ControlService(hDepService, SERVICE_CONTROL_STOP, ssStatus)
then
Exit;

while ssStatus.dwCurrentState <> SERVICE_STOPPED do
begin
Sleep(ssStatus.dwWaitHint);
if not QueryServiceStatus(hDepService, ssStatus) then
Exit;

if ssStatus.dwCurrentState = SERVICE_STOPPED then
begin
Inc(lpDependencies);
Break;
end;

if GetTickCount - dwStartTime > dwTimeout then
Exit;
end;
finally
CloseServiceHandle(hDepService);
end;
Inc(lpDependencies);
end;
finally
HeapFree(GetProcessHeap, 0, lpDependencies);
end;
end;
end;

if not ControlService(schService, SERVICE_CONTROL_STOP, ssStatus) then
Exit;
while ssStatus.dwCurrentState <> SERVICE_STOPPED do
begin
Sleep(ssStatus.dwWaitHint);
if not QueryServiceStatus(schService, ssStatus) then
Exit;
if ssStatus.dwCurrentState = SERVICE_STOPPED then
Break;
if GetTickCount - dwStartTime > dwTimeout then
Exit;
end;
Result := True;
end;

function GetSampleServiceStatus(const ServiceName: PAnsiChar; var
lpServiceStatus:
TServiceStatus): LongBool;
var
schSCManager, schService: SC_HANDLE;
begin
Result := False;

schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if schSCManager = 0 then
Exit;

schService := OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
if schService = 0 then
Exit;
try
if not QueryServiceStatus(schService, lpServiceStatus) then
Exit;

Result := True;
finally
CloseServiceHandle(schService);
end;
end;

end
socoolin1982 2004-12-29
  • 打赏
  • 举报
回复
期待……
飞天凤凰601 2004-12-29
  • 打赏
  • 举报
回复
顶。。。。。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧