基于visual c++之windows核心编程代码分析(9)实现Windows服务并安装,控制

我们进行Windows编程的时候,经常涉及到Windows服务编程,针对Windows服务我们该怎么编程呢,

我们先来实现一个Windows服务并实现之,请见注释代码分析。

/* 头文件 */
#include <windows.h>
/* 全局变量 */
SERVICE_STATUS          SplSrvServiceStatus; 
SERVICE_STATUS_HANDLE   SplSrvServiceStatusHandle; 
/* 函数声明 */
VOID SvcDebugOut(LPSTR String, DWORD Status);
VOID WINAPI SplSrvServiceCtrlHandler (DWORD opcode); 
VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv); 
DWORD SplSrvServiceInitialization (DWORD argc, LPTSTR *argv, 
								   DWORD *specificError); 

/*************************************
* VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv)
* 功能	服务启动函数
*
* 参数	未使用
**************************************/
VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv) 
{ 
	DWORD status; 
	DWORD specificError; 
	// 填充SERVICE_STATUS 结构
	SplSrvServiceStatus.dwServiceType        = SERVICE_WIN32; 
	SplSrvServiceStatus.dwCurrentState       
		= SERVICE_START_PENDING;		// 服务在运行
	SplSrvServiceStatus.dwControlsAccepted   
		= SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; 
	SplSrvServiceStatus.dwWin32ExitCode      = 0; 
	SplSrvServiceStatus.dwServiceSpecificExitCode = 0; 
	SplSrvServiceStatus.dwCheckPoint         = 0; 
	SplSrvServiceStatus.dwWaitHint           = 0; 
	// 注册服务控制请求处理例程
	SplSrvServiceStatusHandle = RegisterServiceCtrlHandler( 
		"Sample_Srv",	// 服务名,在创建服务时使用了
		// SERVICE_WIN32_OWN_PROCESS,因此本参数被忽略。
		SplSrvServiceCtrlHandler);	// 控制请求处理例程,函数名

	if (SplSrvServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) 
	{ 
		SvcDebugOut(" [SPLSRV_SERVICE] RegisterServiceCtrlHandler "
			"failed %d\n", GetLastError()); 
		return; 
	}  
	// 初始化工作,本示例未使用,函数为空
	status = SplSrvServiceInitialization(argc,argv, &specificError);  
	// 初始化出错,用户自行修改
	if (status != NO_ERROR) 
	{ 
		SplSrvServiceStatus.dwCurrentState       = SERVICE_STOPPED; 
		SplSrvServiceStatus.dwCheckPoint         = 0; 
		SplSrvServiceStatus.dwWaitHint           = 0; 
		SplSrvServiceStatus.dwWin32ExitCode      = status; 
		SplSrvServiceStatus.dwServiceSpecificExitCode = specificError; 

		SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus); 
		return; 
	} 
	// 初始化完成,设置运行状态
	SplSrvServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
	SplSrvServiceStatus.dwCheckPoint         = 0; 
	SplSrvServiceStatus.dwWaitHint           = 0; 

	if (!SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus)) 
	{ 
		status = GetLastError(); 
		SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld\n",status); 
	} 
	// 用户自行修改,用于完成服务的工作
	SvcDebugOut(" [SPLSRV_SERVICE] Returning the Main Thread \n",0); 

	return; 
} 


/*************************************
* DWORD SplSrvServiceInitialization(DWORD   argc, 
*	LPTSTR  *argv, 
*	DWORD *specificError)
* 功能	初始化,这里未进行任何工作,留待读者修改
*
* 参数	
**************************************/
DWORD SplSrvServiceInitialization(DWORD   argc, 
								  LPTSTR  *argv, 
								  DWORD *specificError) 
{ 
	return(0); 
}

/*************************************
* VOID WINAPI SplSrvServiceCtrlHandler (DWORD Opcode)
* 功能	服务控制请求的处理函数,与ControlService函数配合。
*
* 参数	服务控制码
**************************************/
VOID WINAPI SplSrvServiceCtrlHandler (DWORD Opcode) 
{ 
	DWORD status; 
	switch(Opcode) 
	{ 
	case SERVICE_CONTROL_PAUSE: 
		// 完成相关功能
		SplSrvServiceStatus.dwCurrentState = SERVICE_PAUSED; 
		break; 
	case SERVICE_CONTROL_CONTINUE: 
		// 完成相关功能
		SplSrvServiceStatus.d
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Visual C++从初学到精通 吕兵 高清PDF带书签 《Visual C++从初学到精通》由浅入深:逐步展现VistJal c++开发中的核心Wiridows编程机制;重点突出:详细讲解Wiridows编程和数据库开发两个典型方向;实例典型:用52个典型实例讲解VisuJaI c++开发的重点知识;侧重开发:包含数据库、网络通信、Windows组件三大开发方向;注重实战:用2个完整案例展现Visual c++开发应用流程和领域。 光盘内容: 《Visual C++从初学到精通》实例源代码Visual C++从初学到精通》多媒体教学视频 《Visual C++从初学到精通》教学PPT 免费赠送的电子图书和视频 《Visual C++从初学到精通》涵盖内容:控制台应用程序、基于对话框的应用程序、单文档应用程序、多文档应用程序、异常处理机制、 Windows应用程序运行机;WinMain()函数、MFC消息映射机制、API文件操作、MFC文件操作、创建位图对象、模态对话框、菜单的创建、工具栏的使用、状态栏的创建、进程和线程的基本概念、Win32的进程处理、Win32的线程处理、MFC的线程处理、线程同步、ODBC组成结构使用ODBC API进行数据库开发、DAO编程方法、ADO对象模型、套接字、客户机/服务器模式、网络字节顺序、半相关与全相关、半双工与全双工、 套接字编程模型、Windows Socket API主要函数、MFC Socket编程、Winlnet编程、创建动态链接库、使用ActiveX控件编写ActiveX控件。
Visual+C++从初学到精通 吕兵 源代码+电子教案 《Visual C++从初学到精通》由浅入深:逐步展现VistJal c++开发中的核心Wiridows编程机制;重点突出:详细讲解Wiridows编程和数据库开发两个典型方向;实例典型:用52个典型实例讲解VisuJaI c++开发的重点知识;侧重开发:包含数据库、网络通信、Windows组件三大开发方向;注重实战:用2个完整案例展现Visual c++开发应用流程和领域。 光盘内容: 《Visual C++从初学到精通》实例源代码Visual C++从初学到精通》多媒体教学视频 《Visual C++从初学到精通》教学PPT 免费赠送的电子图书和视频 《Visual C++从初学到精通》涵盖内容:控制台应用程序、基于对话框的应用程序、单文档应用程序、多文档应用程序、异常处理机制、 Windows应用程序运行机;WinMain()函数、MFC消息映射机制、API文件操作、MFC文件操作、创建位图对象、模态对话框、菜单的创建、工具栏的使用、状态栏的创建、进程和线程的基本概念、Win32的进程处理、Win32的线程处理、MFC的线程处理、线程同步、ODBC组成结构使用ODBC API进行数据库开发、DAO编程方法、ADO对象模型、套接字、客户机/服务器模式、网络字节顺序、半相关与全相关、半双工与全双工、 套接字编程模型、Windows Socket API主要函数、MFC Socket编程、Winlnet编程、创建动态链接库、使用ActiveX控件编写ActiveX控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值