我调试了一个完整的VC检测服务、启动服务、停止服务的程

更新时间:2024-04-17 10:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

我调试了一个完整的VC检测服务、启动服务、停止服务的程序,结构不复杂,就三个函数。该例子是以系统自带的打印缓存服务(Print Spooler)为例演示的。 另外我写了个详细的开发教程,你自己熟悉一下。

// 注意,此程序适应的服务名称 仅为单字符串。 Spooler (√)Net Logon (×)

VC开发服务管理程序简单教程

一、新建VC对话框程序(此例子为SrvCheck),设计界面如下:

二、在SrvCheckDlg.cpp中加入服务相关的头文件:winsvc.h,如下图:

#include

三、在SrvCheckDlg.cpp文件末尾加入以下函数定义:

int ServiceIsRunning(LPCTSTR ServiceName) //检测是否运行 {

SC_HANDLE schService; // ?## 句柄 SC_HANDLE schSCManager;

DWORD RC; //double word 双字节

SERVICE_STATUS ssStatus; UINT return_value;

schSCManager = OpenSCManager(

NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required );

// OpenSCManager函数建立了一个连接到服务控制管理器,并打开指定的数据库 if (!schSCManager) return -1;

schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) {

RC = GetLastError();

CloseServiceHandle(schSCManager);

if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; }

QueryServiceStatus(schService, &ssStatus);

if(ssStatus.dwCurrentState == SERVICE_RUNNING) return_value = 1; else return_value = 0; CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; }

int ServiceStart( LPCTSTR ServiceName) //启动 LPCTSTR 是一种类型 L:long P:指针 // C: 容量 T:win32环境 STR:变量是一个字符串 {

SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC;

UINT return_value;

schSCManager = OpenSCManager(

NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1;

schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) {

RC = GetLastError();

CloseServiceHandle(schSCManager);

if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; }

return_value = StartService(schService, 0, NULL) ? 1 : -1; RC = GetLastError();

CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; }

int ServiceStop(LPCTSTR ServiceName,ULONG TimeoutSeconds) //停止 {

SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC;

UINT return_value; SERVICE_STATUS SrvStatus;

schSCManager = OpenSCManager(

NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1;

schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) {

RC = GetLastError();

CloseServiceHandle(schSCManager);

if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; }

return_value = ControlService(schService, SERVICE_CONTROL_STOP, &SrvStatus) ? 1 : -1;

if(return_value) {

while(QueryServiceStatus(schService, &SrvStatus)) {

if ( SrvStatus.dwCurrentState == SERVICE_STOP_PENDING ) { if(!TimeoutSeconds) break;

if(TimeoutSeconds != -1) TimeoutSeconds--;

Sleep( 1000 ); } else { break; } }

if(SrvStatus.dwCurrentState == SERVICE_STOPPED) { return_value = 1; } else {

return_value = -1; } } else {

return_value = -2; }

RC = GetLastError();

CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; }

四、各按钮代码如下: ①检测服务

if(ServiceIsRunning(\ MessageBox(\服务运行中......\ else MessageBox(\未检测到服务运行!\②停止服务

if(ServiceStop(\ MessageBox(\服务已停止运行!\③启动服务

if(ServiceStart(\ MessageBox(\服务已成功启动!\

Net Logon

WebClient

………………………………………………………………………………………………

void CFuwuDlg::OnButton1() { // TODO: Add your control notification handler code here

CString strTemp; GetDlgItemText(IDC_EDIT1,strTemp);

if(ServiceIsRunning(strTemp)==1) MessageBox(\服务运行中......\ else MessageBox(\未检测到服务运行!\ }

本文来源:https://www.bwwdw.com/article/fmjp.html

Top