手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

用VC 建立Service服务应用程序

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  为什么要使用服务应该程序呢?服务程序就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。

  下面就跟着我一步一步地教你怎么去创建一个服务应用程序吧。

  本文主要介绍了OpenSCManager、CreateService、OpenService、ControlService、DeleteService、RegisterServiceCtrlHandler、SetServiceStatus、StartServiceCtrlDispatcher等操作服务程序的主要几个API的用法,具体的函数参数大家可以查阅MSDN。

  一、建立Win32 Application应用程序(当然你也可以建立其它的应用程序,但服务一般是没有用户界面的),并命名为ServiceTest。

  二、定义全局函数变量

//定义全局函数变量

void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);

TCHAR szServiceName[] = _T("ServiceTest");
BOOL bInstall;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;
  三、添加Init初始化函数

  这里主要是设置服务句柄和状态。

hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
tatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
  四、添加安装和删除服务函数

  这里主要是用到了五个函数OpenSCManager、CreateService、OpenService、ControlService、DeleteService。OpenSCManager用于打开服务控制管理器;CreateService用于创建服务;OpenService用于打开已有的服务,返回该服务的句柄;ControlService则用于控制已打开的服务状态,这里是让服务停止后才删除;DeleteService用于删除指定服务。

BOOL Install();
{
 //这里列出主要的两个函数,其它的可以在代码里找。
 //打开服务控制管理器

 OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 //创建服务
 
 SC_HANDLE hService = ::CreateService(
  hSCM, szServiceName, szServiceName,
  SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
  SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
  szFilePath, NULL, NULL, _T(""), NULL, NULL);

 ::CloseServiceHandle(hService);
 ::CloseServiceHandle(hSCM);
}

BOOL Uninstall();
{
 //这里列出主要的两个函数,其它的可以在代码里找。
 //打开服务控制管理器

 OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 //打开服务

 OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);

 //停止服务

 ControlService(hService, SERVICE_CONTROL_STOP, &status);

 //删除服务

 DeleteService(hService);

 …
}
  五、添加服务主线程函数和控制函数

  这里调用RegisterServiceCtrlHandler来注册服务的控制函数,这里要设置status.dwControlsAccepted为SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。

void WINAPI ServiceMain()
{
 // Register the control request handler

 status.dwCurrentState = SERVICE_START_PENDING;
 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制

 //注册服务控制

 hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
 if (hServiceStatus == NULL)
 {
  LogEvent(_T("Handler not installed"));
  return;
 }
 SetServiceStatus(hServiceStatus, &status);
 status.dwWin32ExitCode = S_OK;
 status.dwCheckPoint = 0;
 status.dwWaitHint = 0;
 status.dwCurrentState = SERVICE_RUNNING;
 SetServiceStatus(hServiceStatus, &status);

 //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可

 int i = 0;
 while (i < 10)
 {
  Sleep(1000);
  i ;
 }
 //

 status.dwCurrentState = SERVICE_STOPPED;
 SetServiceStatus(hServiceStatus, &status);
 LogEvent(_T("Service stopped"));
}
  六、在主线程函数里注册控制函数和程序执行主体

void WINAPI ServiceMain()
{
 …

 //如上,这里主要是说明这就是程序的执行体
 //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可

 int i = 0;
 while (i < 10)
 {
  Sleep(1000);
  i ;
 }
 …
}
  七、在main函数里注册添加安装、删除、注册主函数

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS