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;
}

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

参考nssm源代码?