程式中打开windows上本机已存在的服务

      有时候写了程式要运行时需要一些前提服务满足才可以的,然而由于很多不可预料的原因,往往有时候程式所依赖的服务没有打开或者被关闭了....这个时候我们就先要打开所需要的服务.....我就曾经见到同学玩暗黑3时需要的一个服务没有打开结果进不了游戏...如果暗黑3的程式中可以对依赖的服务进行打开,岂不很好.....我觉得这也是提高程式用户体验的一个步骤....尽量把少的工作交给用户......

 

以下以打开本机的VSS服务为例.....VSS服务....可能没多少人了解....我在网上搜索的时候也一般只有一些国外的网站对其进行了稍微深入的介绍.....我稍后会写一篇关于VSS编程的文章,所以这里就先不深究了.....

 

先看代码:

 

 
char szServiceName[80] = "VSS";

	SC_HANDLE schSCManager;
	SC_HANDLE schService;
	
	//first:get database connect
	schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
	if( schSCManager == NULL )
	{
		printf("OpenSCManager failed (%d)\n",GetLastError());
		return -1;
	}
	//second:get service handle
	schService = OpenService(schSCManager,szServiceName,SERVICE_ALL_ACCESS);
	if( schService == NULL )
	{

		printf("OpenService failed (%d)\n",GetLastError());


		CloseServiceHandle(schSCManager);
		
	}
	//third:start service
	if( !StartService(schService,0,NULL) )
	{
		if( ERROR_SERVICE_ALREADY_RUNNING == GetLastError())
		{
			//printf("VSS is already running,good...\n");
			//system("cls");
		}
		else
		{
			printf("start service failed (%d)\n",GetLastError());
			system("cls");
		}

		CloseServiceHandle(schService);
		CloseServiceHandle(schSCManager);
	}
	else
	{
		printf("start service OK");
	}


先看szServiceName这个字符数组,其值即为我们要打开的服务的名称.....这里要注意一个问题,服务的显示的名称和服务名称是不同的东西...我们可以在windows服务管理里面看到

其中service name才是我们可以在程式中用到的,Display name是显示名称...

SC_HANDLE schSCManager这个是服务控制管理器句柄

SC_HANDLE schService这个是服务句柄,用过文件句柄的应该比较熟悉,在windows下调用API写文件或者读文件是先需要得到文件句柄的,其实这里是一样的道理,要想启动服务,先要得到这个服务的句柄

 

//first:get database connect
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if( schSCManager == NULL )
{
printf("OpenSCManager failed (%d)\n",GetLastError());
return -1;
}

这里得到服务控制管理器的句柄,使用所有权限

//second:get service handle
schService = OpenService(schSCManager,szServiceName,SERVICE_ALL_ACCESS);
if( schService == NULL )
{

printf("OpenService failed (%d)\n",GetLastError());


CloseServiceHandle(schSCManager);
}

 

这里"打开服务",所谓的打开并不是启动,而是得到服务句柄

 

 

//third:start service
if( !StartService(schService,0,NULL) )
{
if( ERROR_SERVICE_ALREADY_RUNNING == GetLastError())
{
//printf("VSS is already running,good...\n");
//system("cls");
}
else
{
printf("start service failed (%d)\n",GetLastError());
system("cls");
}

CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
else
{
printf("start service OK");
}

 

这里启动服务....收工

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值