程式中打开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");
}
这里启动服务....收工
- 程式中打开windows上本机已存在的服务
- 打开已存在的Excel
- windows 7 本机已安装mysql5的情况上 安装XAMPP
- 打开一已存在的进程OpenProcess
- Eclipse打开已存在的Android项目
- SQLserver 2000中出现“指定的服务并未以已安装的服务存在 解决方案
- SQLserver 2000中出现“指定的服务并未以已安装的服务存在 解决方案
- 指定的SID在本机上已经存在解决方法
- 如何打开一个已存在的txt格式的文本文档 ,并显示在QTextEdit中
- 在Carbide c/c++中如何打开一个已存在的工程
- 指定的服务并未以已安装的服务存在
- Eclipse打开已存在工程
- 在windows服务程序中打开带窗体的可执行文件
- 在windows中打开服务的几种方式(
- 打开一张已存在的图纸并设置为当前
- 打开已存在 Android项目及常见的问题
- 打开已存在 Android项目及常见的问题
- Eclipse 中导入已存在的工程
- 多线程 NSThread
- java实现标点全角/半角转换
- 关于sfo的备注和bo的备注字段
- 【动态规划】背包问题
- 读书笔记整理八:智能基础结构增强功能11g
- 程式中打开windows上本机已存在的服务
- 百度手机地图升级“彩色蚯蚓”
- 线段相交:Intersection
- 计时器(2)之数字时钟
- IT男标准装备
- ADC10多路转换
- IT女上班标准装备图
- 宏和枚举有什么区别,定义数组时使用枚举和使用宏的区别
- sqlite3中的数据类型