Jet_likemian 2021-12-13 11:17 采纳率: 0%
浏览 7

c/C++ 创建windows服务成功

问题遇到的现象和发生背景

代码从main方法中运行,调用InstallService()方法后,可以看到服务中有创建的服务,但是启动服务出错,错误 1053:服务没有及时响应或控制请求.

问题相关代码,请勿粘贴截图
#include <iostream>
#include "Windows.h"
#include <tchar.h>

SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning = true;

TCHAR szServiceName[] = _T("JSer");

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
    switch (Opcode)
    {
    case SERVICE_CONTROL_PAUSE:
        m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
        break;

    case SERVICE_CONTROL_CONTINUE:
        m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        break;

    case SERVICE_CONTROL_STOP:
        m_ServiceStatus.dwWin32ExitCode = 0;
        m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        m_ServiceStatus.dwCheckPoint = 0;
        m_ServiceStatus.dwWaitHint = 0;
        SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
        bRunning = false;
        break;

    case SERVICE_CONTROL_INTERROGATE:
        break;
    }
    return;
}
 
void WINAPI service_main(int argc, char** argv)
{
    m_ServiceStatus.dwServiceType = SERVICE_WIN32;
    m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
    m_ServiceStatus.dwWin32ExitCode = 0;
    m_ServiceStatus.dwServiceSpecificExitCode = 0;
    m_ServiceStatus.dwCheckPoint = 0;
    m_ServiceStatus.dwWaitHint = 0;
    m_ServiceStatusHandle = RegisterServiceCtrlHandler(szServiceName, ServiceCtrlHandler);
    if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        DWORD nError = GetLastError();
        return;
    }
    //add your init code here
    
    //add your service thread here

    // Initialization complete - report running status 
    m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    m_ServiceStatus.dwCheckPoint = 0;
    m_ServiceStatus.dwWaitHint = 9000;
    if (!SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus))
    {
        DWORD nError = GetLastError();
        return;
    }
    // add code .
    while (true)
    {
        Sleep(5000);
    }
    return;
}
 
BOOL InstallService()
{
    SC_HANDLE schSCManager, schService;
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
        return false;
    LPCTSTR lpszBinaryPathName = L"D:/conmain.exe";
    schService = CreateService((struct SC_HANDLE__*)schSCManager, szServiceName, szServiceName,             // service name to display  
        SERVICE_ALL_ACCESS,          // desired access  
        SERVICE_WIN32_OWN_PROCESS, // service type  
        SERVICE_AUTO_START,        // start type  
        SERVICE_ERROR_NORMAL,        // error control type  
        lpszBinaryPathName,          // service's binary  
        NULL,                        // no load ordering group  
        NULL,                        // no tag identifier  
        NULL,                        // no dependencies  
        NULL,                        // LocalSystem account  
        NULL);                       // no password  

    if (schService == NULL)
        return false;
    SERVICE_DESCRIPTION   sdBuf;
    sdBuf.lpDescription =(LPWSTR)L"kiko's Service for Test .";
    ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &sdBuf);
    CloseServiceHandle((struct SC_HANDLE__*)schService);
    return true;
}
BOOL DeleteService()
{
    HANDLE schSCManager;
    SC_HANDLE hService;
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
        return false;
    hService = OpenService((struct SC_HANDLE__*)schSCManager, szServiceName, SERVICE_ALL_ACCESS);
    if (hService == NULL)
        return false;
    if (DeleteService(hService) == 0)
        return false;
    if (CloseServiceHandle(hService) == 0)
        return false;
    else
        return true;
}
int main(int argc, const char* argv[])
{
    if (InstallService())
        printf("\n Service Installed Sucessfully\n");
    else
        printf("\n Service has been installed\n");
    //BOOL result = DeleteService();
    //SERVICE_TABLE_ENTRY DispatchTable[] = { {(LPWSTR)szServiceName,(LPSERVICE_MAIN_FUNCTION)service_main},{NULL,NULL} };
    //StartServiceCtrlDispatcher(DispatchTable);
    return 0;
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 赵4老师 2021-12-13 13:12
    关注

    参考nssm源代码?

    评论

报告相同问题?

问题事件

  • 创建了问题 12月13日

悬赏问题

  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词