如何用程序控制一个服务的启动,关闭,象SQLSERVER的SERVER MANAGER(100分)

  • 主题发起人 主题发起人 一剑封喉
  • 开始时间 开始时间

一剑封喉

Unregistered / Unconfirmed
GUEST, unregistred user!
现在做一个服务,想象SQLSERVER中的server service manager一样能够用程序控制此服务
的启动,关闭,不知道该用什么函数,好象WINAPI中有这样的函数,请高手指教一二
 
怎么没有人说话呀,分不够还有的。哥们。帮帮忙
 
CreateService /* 建立服务 */
OpenService /* 启动或停止服务 */
 
alvinlv
这些函数需要调用哪些库单元呀
 
xixi,我倒写过一个(原来是有关闭、启动服务部分的,后来不小心给删除了),所以现在
只有取服务状态部分了
首先
uses winsvc;//关于service的函数定义在这个unit中,d5自带的啦
要控制一个service的具体流程大概是这样的:
1、取得服务数据库的handle
2、根据服务数据库的handle取得服务的handle
3、根据服务的handle来取服务的状态或者控制服务
下面是一段取Sql server状态的程序
function tserviceform.GetSqlServerStatus: Boolean;
var
; SrvHandle: SC_HANDLE;//这些都在winsvc单元中定义的
; Service_Status: _SERVICE_STATUS;//在winsvc单元中有定义
; SrvStatus: Integer;
begin
//取sql server的状态,如果sql server正在运行则返回true ,否则返回 false
; SrvHandle := OpenSCManager('', SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
; SrvHandle := OpenService(SrvHandle, PChar('MSSQLServer'), SERVICE_QUERY_STATUS or SERVICE_START);
; case SrvHandle of
; ; ERROR_ACCESS_DENIED: Memo.Lines.Add('The specified service control manager database handle does not have access to the service.');
; ; ERROR_INVALID_HANDLE: Memo.Lines.Add('The specified handle is invalid.');
; ; ERROR_INVALID_NAME: Memo.Lines.Add('The specified service name is invalid.');
; ; ERROR_SERVICE_DOES_NOT_EXIST: Memo.Lines.Add('The specified service does not exist.');
; end;
; if QueryServiceStatus(SrvHandle, Service_Status) then
; begin
; //判断Sql Server服务的状态
; ; SrvStatus := Service_Status.dwCurrentState;
; ; case SrvStatus of
; ; ; SERVICE_STOPPED: Memo.Lines.Add('The service is not running.');
; ; ; SERVICE_START_PENDING: Memo.Lines.Add('The service is starting.');
; ; ; SERVICE_STOP_PENDING: Memo.Lines.Add('The service is stopping.');
; ; ; SERVICE_RUNNING: memo.lines.add('The service is running.');
; ; ; SERVICE_CONTINUE_PENDING: Memo.Lines.Add('The service continue is pending.');
; ; ; SERVICE_PAUSE_PENDING: Memo.Lines.Add('The service pause is pending.');
; ; ; SERVICE_PAUSED: Memo.Lines.Add('The service is paused');
; ; end;
; ; Result := (SrvStatus = SERVICE_RUNNING);
; end
; else
; ; Result := False;
end;
具体的service函数可以看msdn中的Service Functions部分。
 
honghs兄,多谢你的帮助,可是虽然知道了服务的状态,那怎样能够用程序动态的改变它
的状态呢?还请你再指教一二。
 
因为小弟比较急,所以请大侠多多帮助,非常感谢
 
看看这个吧——http://www.delphibbs.com/delphibbs/dispq.asp?lid=652512
 
多谢:5rain6sky兄,可是小弟还有一事不明,暂停服务和停止服务有什么不同,
象SQLSERVER那样暂停,到底有什么区别,那么暂停和继续服务的命令是pause和continue吗?
。多谢
 
to 一剑封喉:
如果某个服务做的是一件连续的后台工作,比如做一个循环,那么暂停就有用了。
很明显,它和停止的区别在于可以保持一个中间状态,重启后可以接着来。
SQL Server也有做一些后台处理工作的时候,比如一个定时执行的作业或是存储过程。

net命令里暂停和继续的参数确实是你说的那两个,即——
暂停:net pause MSSQLSERVER
继续:net continue MSSQLSERVER
——你在控制台打net可以列出该命令所有的参数。
 
不好意思,5rain6sky兄,还要麻烦你,你在http://www.delphibbs.com/delphibbs/dispq.asp?lid=652512
说过,net 命令在98下不可以的,所以现在我要做一个这样的通用的SERVICE MANAGER
那怎样才能适用与各种操作系统呢?是不是要判断操作系统的类别,
如果是这样,那怎样知道操作系统的类别?而且 98下判断象你说的是
‘启动:scm -Service MSSQLSERVER -Action 1
停止:scm -Service MSSQLSERVER -Action 6’
那暂停和继续呢?,能不能告知一二,多谢
 
net命令之所以不能在98下运行是因为98下根本就没有系统服务的概念,NT以上才有。
比如在98下所谓的SQL Server服务其实就是那种可以没有界面而在后台跑的应用程序。
也可能你指的就是用CreateService创建的那些程序,我觉得应该可以用SetServiceStatus
这个API来控制吧,我没用过,不知道实际行不行,你查查MSDN吧。
但是如果你只是针对纯粹意义上的服务程序,那就不用考虑98了。
另外那个scm命令是SQL Server自带的,只对它自己的服务起作用,通用的它做不了。
 
SetServiceStatus这个命令我用的不太好,请指示,不过SQLSERVER在98下也可用单机版
,那它也有SERVICE MANAGER ,这是怎么一回事呢?我现在的程序就是要适用与任何操作系统
所以必须也能在98下运行的,所以,还望您多多指教
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=599038
 
:DragonPC_???兄,请看看我上面的问题,98下我怎样处理SERVICE,和怎样做成象SQLSERVER
那样的可以启动停止服务的程序
 
OpenService StartService ControlService 都是NT下的函数,请原谅我没有看清楚你的问题,
我想98下存在服务,但是此服务不同于彼服务,98下的服务程序只是简简单单的一个应用程序而
已,它下面的服务程序没有所谓的启动、停止的概念,当然也可以有,只要你编写的服务程序可
以受到控制就可以吗,比如可以自己定义几个消息作为启动、停止服务的Handle,需要时发送一
个相应信息给你的应用程序即可。[:)]

98下面服务和应用程序的区别不多,我可以想到的就是在用户注销的时候,应用程序会被Free而
服务仍然在运行而已。
 
'98下面服务和应用程序的区别不多,我可以想到的就是在用户注销的时候,应用程序会被Free而
服务仍然在运行而已。 ':DragonPC_???兄这句话就是我要实现的目标,可是在98下具体怎样
做呢?首先这种服务也应该象NT下一样能够启动和停止,可是象你说的那样是启动停止应用程序
的话,那在用户注销的时候不是一样会被终止的吗?请指教
 
Windows 98下的服务实现相信你应该很清楚 - RegisterServiceProcess 函数即可

我没有试过已经注册为服务的应用程序在用户注销的时候是否会被系统Free掉,你可
以自己试试,我用的是Windows 2000。
 
:DragonPC_???兄,RegisterServiceProcess 我真的不知道怎样在98下注册服务呀,请详细点
真不好意思,麻烦你了,多谢
 
const
; RSP_SIMPLE_SERVICE = 1
; RSP_UNREGISTER_SERVICE ;= 0

declear part :
function RegisterServiceProcess(a:longint;const b:longint):dword;stdcall;far;external 'Kernel32.dll' name 'RegisterServiceProcess';

implementation part :
ddd:=GetCurrentProcessId;
if (RegisterServiceProcess(ddd,RSP_SIMPLE_SERVICE)=0) then
;showmessage('error!');
 
后退
顶部