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

来源:互联网 发布:淘宝改版中国质造 编辑:程序博客网 时间:2024/05/21 10:38
      有时候写了程式要运行时需要一些前提服务满足才可以的,然而由于很多不可预料的原因,往往有时候程式所依赖的服务没有打开或者被关闭了....这个时候我们就先要打开所需要的服务.....我就曾经见到同学玩暗黑3时需要的一个服务没有打开结果进不了游戏...如果暗黑3的程式中可以对依赖的服务进行打开,岂不很好.....我觉得这也是提高程式用户体验的一个步骤....尽量把少的工作交给用户......

 

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

 

先看代码:

 

 
char szServiceName[80] = "VSS";SC_HANDLE schSCManager;SC_HANDLE schService;//first:get database connectschSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if( schSCManager == NULL ){printf("OpenSCManager failed (%d)\n",GetLastError());return -1;}//second:get service handleschService = OpenService(schSCManager,szServiceName,SERVICE_ALL_ACCESS);if( schService == NULL ){printf("OpenService failed (%d)\n",GetLastError());CloseServiceHandle(schSCManager);}//third:start serviceif( !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");
}

 

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