您的位置:首页 > 编程语言 > C语言/C++

VC++启动或停止指定的系统后台服务

2012-12-08 00:30 501 查看

方法一:

/* write by jruinet */

// NtServiceControlDlg.cpp : 实现文件

#include "stdafx.h"

#include "NtServiceControl.h"

#include "NtServiceControlDlg.h"

#include ".\ntservicecontroldlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CNtServiceControlDlg 对话框

CNtServiceControlDlg::CNtServiceControlDlg(CWnd* pParent /*=NULL*/)

: CDialog(CNtServiceControlDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CNtServiceControlDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CNtServiceControlDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)

ON_WM_CLOSE()

ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)

ON_WM_TIMER()

END_MESSAGE_MAP()

// CNtServiceControlDlg 消息处理程序

BOOL CNtServiceControlDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// 将\“关于...\”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

szServiceName = "ServiceV2";

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

// 执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

SetTimer(1, 1000, NULL); // 1 second interval

hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

// ASSERT(hSCM);

// open the service

hService = OpenService(hSCM,szServiceName,SERVICE_ALL_ACCESS);

return TRUE; // 除非设置了控件的焦点,否则返回 TRUE

}

void CNtServiceControlDlg::ShowStatus()

{

if (hService)

{

// Get the current status

SERVICE_STATUS ss;

memset(&ss, 0, sizeof(ss));

BOOL b = QueryServiceStatus(hService, &ss);

if(!b) {

DWORD dwErr = GetLastError();

ASSERT(0);

} else {

dwErr = ss.dwWin32ExitCode;

dwState = ss.dwCurrentState;

// If the service is running, send a control request

// to get its current status

if (dwState == SERVICE_RUNNING) {

b = ::ControlService(hService,

SERVICE_CONTROL_INTERROGATE,

&ss);

if (b) {

dwErr = ss.dwWin32ExitCode;

dwState = ss.dwCurrentState;

}

}

}

// close the service handle

// CloseServiceHandle(hService);

}

// close the service control manager handle

// CloseServiceHandle(hSCM);

// See what we got

char buf[64];

if (dwErr == 0xFFFFFFFF) {

SetDlgItemText(IDC_EXITCODE, "<unknown>");

} else {

sprintf(buf, "%8.8lXH (%d)", dwErr, dwErr);

SetDlgItemText(IDC_EXITCODE, buf);

}

switch (dwState) {

case SERVICE_STOPPED:

strcpy(buf, "Stopped");

break;

case SERVICE_START_PENDING:

strcpy(buf, "Start pending");

break;

case SERVICE_STOP_PENDING:

strcpy(buf, "Stop pending");

break;

case SERVICE_RUNNING:

strcpy(buf, "Running");

break;

case SERVICE_CONTINUE_PENDING:

strcpy(buf, "Continue pending");

break;

case SERVICE_PAUSE_PENDING:

strcpy(buf, "Pause pending");

break;

case SERVICE_PAUSED:

strcpy(buf, "Paused");

break;

default:

strcpy(buf, "<Unknown>");

break;

}

SetDlgItemText(IDC_STATUS, buf);

}

void CNtServiceControlDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{ CDialog::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

// 这将由框架自动完成。

void CNtServiceControlDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

//ShowStatus();

CDialog::OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。

HCURSOR CNtServiceControlDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

void CNtServiceControlDlg::OnBnClickedButton3()

{

BOOL b = StartService(hService, 0, NULL);

if(!b) {

DWORD dwErr = GetLastError();

MessageBox("服务当前正在运行,请关闭服务后再重新启动!");

}

ShowStatus();

}

void CNtServiceControlDlg::OnClose()

{

// close the service handle

CloseServiceHandle(hService);

// close the service control manager handle

CloseServiceHandle(hSCM);

CDialog::OnClose();

}

void CNtServiceControlDlg::OnBnClickedButton4()

{

// Get the service name

BOOL b = ControlService(hService,

SERVICE_CONTROL_STOP,

&ss);

if(!b) {

DWORD dwErr = GetLastError();

MessageBox("服务当前以关闭!");

}

ShowStatus();

}

void CNtServiceControlDlg::OnTimer(UINT nIDEvent)

{

ShowStatus();

//CDialog::OnTimer(nIDEvent);

}

方法二:

system("net stop <service name>");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: