没有合适的资源?快使用搜索试试~ 我知道了~
WIndows之VC++&MFC;后台服务程序开发
5星 · 超过95%的资源 需积分: 35 158 下载量 38 浏览量
2013-02-28
16:17:23
上传
评论
收藏 73KB DOC 举报
温馨提示
试读
11页
在2000/XP等基于NT 的操作系统中,有一个服务管理器,它管理的后台进程被称为 service。服务是一种应用程序类型,它在后台运行,与 UNIX 后台应用程序类似。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web 服务器、数据库服务器以及其他基于服务器的应用程序。 后台服务 程序是在后台悄悄运行的。我们通过将自己的程序登记为服务,可以使自己的程序不出现在任务管理器中,并且随系统启动而最先运行,随系统关闭而最后停止。 服务控制管理器是一个RPC 服务器,它显露了一组应用编程接口,程序员可以方便的编写程序来配置服务和控制远程服务器中服务程序。 服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程序 包含下面三个函数: 1。服务程序主函数(main):调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制管理程序。 2。服务入口点函数(ServiceMain):执行服务初始化任务,同时执行多个服务的服务进程有多个服务入口函数。 3。控制服务处理程序函数(Handler):在服务程序收到控制请求时由控制分发线程引用。(此处是Service_Ctrl)。 另外在系统运行此服务之前需要安装登记服务程序:installService 函数。删除服务程序则需要先删除服务安装登记:removeService 函数。
资源推荐
资源详情
资源评论
后台服务程序开发模式
一直感觉 太复杂了,但昨天看了汪蒲阳编著的因特网应用编程,其中写到后台服务程序的编
写,论述的非常详细,而且逻辑清晰,看了之后感觉明白不少,故拿来与需要之人共享,并更正了原程序
的一些错误,补充了一些材料。另外还有一种用 编写后台服务程序的思路(不算 上服务程序开
发模型)以后整理好了再发上来。
在 等基于 的操作系统中,有一个服务管理器,它管理的后台进程被称为 。服
务是一种应用程序类型,它在后台运行,与 后台应用程序类似。服务应用程序通常可以在本地和通
过网络为用户提供一些功能,例如客户端服务器应用程序、服务器、数据库服务器以及其他基于服
务器的应用程序。
后台服务 程序是在后台悄悄运行的。我们通过将自己的程序登记为服务,可以使自己的程序不出现
在任务管理器中,并且随系统启动而最先运行,随系统关闭而最后停止。
服务控制管理器是一个 服务器,它显露了一组应用编程接口,程序员可以方便的编写程序来配
置服务和控制远程服务器中服务程序。
服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程
序
包含下面三个函数:
。服务程序主函数():调用系统函数 !"#连接程序主线程到服
务控制管理程序。
。服务入口点函数($):执行服务初始化任务,同时执行多个服务的服务进程有多
个服务入口函数。
%。控制服务处理程序函数(&' ):在服务程序收到控制请求时由控制分发线程引用。(此
处是 ( )。
另外在系统运行此服务之前需要安装登记服务程序: 函数。删除服务程序则需要先删
除服务安装登记:)函数。
服务类型:
类型 说明
(*+(,$(!
=
文件系统驱动服务。
(-+(!= 驱动服务。
(%(.(.
=/
独占一个进程的服务。
(%(&0(.
=%
与其他服务共享一个进程的服务。
新建 % 控制台程序, 其源文件名为 ""。我用的开发工具是 。
1.服务程序主函数
服 务 控 制 管 理 程 序 启 动 服 务 程 序 后 , 等 待 服 务 程 序 主 函 数 调 用 系 统 函
!"# 。一个 (%(.(. 类 型 的服务应该 立 即调 用
!"# 函数,可 以在服 务启动 后让服务入 口点函 数完成 初始化 工作。对于
(%(.(.类型的服务和程序中所有服务共同的初始化工作可以在主函数中完
成,但不要超过 % 秒。否则必须建立另外的线程完成这些共同的初始化工作,从而保证服务程序主函数
能及时地调用 !"#函数。
主函数处理了三中命令行参数:1 1)1'23分别用于安装,删除和调试服务程序。
如果不带参数运行,则认为是服务控制管理出现启动该服务程序。参数不正确则给出提示信息。
!"#函数负责把程序主线程连接到服务控制管理程序。具体描述如下:
4..+ !"#5)+(04+(, " 67
" 指向 (04+(,结构类型的数组,他包含了调用进程所提供
的每个服务的入口函数和字符串名。表中的最后一个元素必须为 ++,指明入口表结束。
(04+(,结构具体描述如下:
8"'92((04+(,
:
+ "7
+($0(*. ")7
;(04+(,<+(04+(,7
"是一个以 ++结尾的字符串,标识服务名。如果是
(%(.(.类型的服务,这个字符串会被忽略。
lpServiceProc 指向服务入口点函数。
服务程序主函数。
#include "stdafx.h"
#include "Windows.h"
#dene SZAPPNAME "serverSample" 服务程序名
#dene SZSERVICENAME "serviceSample" 标识服务的内部名
/内部变量
bool bDebugServer=false;
SERVICE_STATUS ssStatus;
SERVICE_STATUS_HANDLE sshStatusHandle;
DWORD dwErr=0;
TCHAR szErr[256];
下面的函数由程序实现
void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI Service_Ctrl(DWORD dwCtrlCode);
void installService();
void removeService();
void debugService(int argc,char** argv);
bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD
dwWaitHint);
void AddToMessageLog(LPTSTR lpszMsg);
int _tmain(int argc, _TCHAR* argv[])
{
SERVICE_TABLE_ENTRY dispatchTable[]=
{
{TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},
{ NULL,NULL}
};
if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
{
if(_stricmp("install",argv[1]+1)==0)
{
installService();
}
else if(_stricmp("remove",argv[1]+1)==0)
{
removeService();
}
else if(_stricmp("debug",argv[1]+1)==0)
{
bDebugServer=true;
debugService(argc,argv);
}
else
{ 如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
!"#函数。
prinJ("%s - install to install the service \n",SZAPPNAME);
prinJ("%s - remove to remove the service \n",SZAPPNAME);
prinJ("%s - debug to debug the service \n",SZAPPNAME);
prinJ("\n StartServiceCtrlDispatcher being called.\n");
prinJ("This may take several seconds.Please wait.\n");
if(!StartServiceCtrlDispatcher(dispatchTable))
AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
else
剩余10页未读,继续阅读
qin522106350
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页