WINDOWS NT服务的创建方法

本文介绍如何使用C++在Windows环境下创建自定义服务程序,包括服务的注册、启动、停止等操作,并提供了一个完整的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以为以VC6.0开发工具为例,  .NET C++是一样的。
可以使用 控制台WIN32ATL (.NET 的ATL用的模板,而VC6.0不是)。

程序框架主要由两部分板成, 一个服务主函数(ServiceMain),另一个是用于服务管理控制用的(ServiceControlHandler)。
一、步聚:
1. 注册服务
2.永动服务

二、代码编写

#include "windows.h"
#include "winsvc.h"

SERVER_STATUS g_ServiceStatus;  //用于存放当前服务状态, 启动, 停止, 恢复。。。。
SERVICE_STATUS_HANDLER g_ServiceStatusHandler; //控制句柄

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv); //记住要加WINAPI, 为啥原因自己想喽
void WINAPI ServiceControlHandler(DWORD dwOpcode); //状态控制
void InstallService();
void UnInstallService();

int main()
{
    SERVICE_TABLE_ENTRY  DispatcherTable[] = {{_T("Your Server Name"), NULL}, {NULL, NULL}}; //为啥用两个,国际惯例哈。
    StartServiceCtrlDispatcher(DispatcherTable);
}

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv)
{
      g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; //启动状态
      g_ServiceStatus.dwServiceType  = SERVICE_WIN32_OWN_PROCESS; //为啥用这个参数去看MSDN
      g_ServiceStatus.dwControlsAccepted = SERVICE_ACCPET_STOP; //我仅接受停止, 恢得,暂停自己加就行了
      g_ServiceStatusHandler = RegisterServiceControlHandler(_T("Your Server Name"), ServiceControlHandler);//注册控制函数啦
      if(g_ServiceStatusHandler == (SERVICE_STATUS_HANDLER) 0)
            return;
      g_ServicveStatus.dwServiceState = SERVICE_RUNNING; //置运行状态
     
    if(!SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus))
          return;
    //这里开始放置你的处理线程或代码了
    .....
}

void WINAPI ServiceMain(DWORD dwOpcode)
{
     switch(Opcode)
    {
    case SERVICE_CONTROL_PAUSE:
              g_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
              break;

    case SERVICE_CONTROL_CONTINUE:
             g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
             g_bIsRunning = TRUE;
             break;
    case SERVICE_CONTROL_STOP:  //因为我只设了停止
             g_ServiceStatus.dwWin32ExitCode = 0;
             g_ServiceStatus.dwServiceSpecificExitCode = 0;
             g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
             SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus);
             g_bIsRunning = FALSE;
             break;
    case SERVICE_CONTROL_INTERROGATE:
             break;
    }
   
}

//安装服务
void InstallService()
{  
    TCHAR szDir[_MAX_PATH];
    DWORD dwRet = GetModuleFileName(NULL, szDir, _MAX_PATH);
    szDir[dwRet] = _T('/0');
    SC_HANDLE hSCM, hService;
    hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if(!hSCM)
        return;  
    hService = ::CreateService(hSCM,  _T("Your Service Name"),  _T("Your Service Name 描述"),
        SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START,
        SERVICE_ERROR_NORMAL,
        szDir,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL);
    if(!hService)
        return;
}

//缺载服务
void UnInstallService()
{
    SC_HANDLE hSCM, hService;
    hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if(!hSCM)
        return;

    hService = ::OpenService(hSCM,  _T(”Your Service Name"), SERVICE_ALL_ACCESS);
    if(!hService)
        return;  
    ::DeleteService(hService);
    CloseServiceHandle(hService);

}

代码有通不过的地方,自己改哈, 有啥不正确之处欢迎各位指正。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值