快速业务通道

用C++ Builder在WINNT下编制一个Service

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
RROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh, &ss);
//必须随时更新数据库中Service的状态。
Mycode(); //这儿可放入用户自己的代码
ss.dwServiceType=SERVICE_WIN32_OWN_
PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
Mycode();// 这儿也可放入用户自己的代码
}

在ServiceMain()中应该立即调用

RegisterServiceCtrlHandler()注册一个Handler

去处理控制程序或控制面板对Service的控制要求。

Handler()被转发器调用去处理要求,

下面是Handler()的源代码:

void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP: //停止Service
Mycode();//这儿可放入用户自己的相关代码
ss.dwWin32ExitCode = 0;
ss.dwCurrentState =SERVICE_STOPPED;
//把Service的当前状态置为STOP
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus (ssh,&ss);
/必须随时更新数据库中Service的状态
break;
case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus (ssh,&ss);
//必须随时更新数据库中Service的状态
break;
}
}

好了,Service本体程序已基本完成,我们接着来看一下Service的控制程序:

控制程序是一个标准的window程序,上面主要有四个按纽:Create Service、Delete Service、start、stop,分别用来产生、删除、开始和停止Service。下面是它们的部分源代码:

1. 产生Service

void __fastcall TForm1::CreateBtnClick(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
if (scm!=NULL)
{
svc=CreateService(scm,"W.Z.SERVICE","W.Z.SERVICE",//Service名字
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, //以自动方式开始
SERVICE_ERROR_IGNORE,
"C:\\ntservice.exe", //Service本体程序路径,必须与具体位置相符
NULL,NULL,NULL,NULL,NULL);
if (svc!=NULL)
CloseServiceHandle(svc);
CloseServiceHandle(scm);
}
}

2. 删除Service

void __fastcall TForm1::DeleteBtnClick(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if (scm!=NULL)
{
svc=OpenService(scm,"W.Z.SERVICE",SERVICE_ALL_ACCESS);
if (svc!=NULL)
{
QueryServiceStatus(svc,&ServiceStatus);
if (ServiceStatus.dwCurrentState==SERVICE_RUNNING)//删除前,先停止此Service.
ControlService(svc,SERVICE_CONTROL_STOP,&ServiceStatus);
DeleteService(svc);
CloseServiceHandle(svc); //删除Service后,最好再调用CloseServiceHandle
}
//以便立即从数据库中移走此条目。
CloseServiceHandle(scm);
}
}

3. 开始Service

void __fastcall TForm1::StartBtnClick(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if (scm!=NULL)
{
svc=OpenService(scm,"W.Z.SERVICE",SERVICE_START);
if (svc!=NULL)
{
StartService(svc,0,NULL);//开始Service
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
}

4.停止Service

void __fastcall TForm1::StopBtnClick(TObject *Sender)
{
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
svc=OpenService(scm,"W.Z.SERVICE",SERVICE_STOP|SERVICE_QUERY_STATUS);
if (svc!=NULL)
{
QueryServiceStatus(svc,&ServiceStatus);
if (ServiceS

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号