关于windows服务启动的有关问题,请问

关于windows服务启动的问题,请教
C/C++ code

void Help()
{
         printf("\t-install    安装windows服务\n");
    printf("\t-uninstall  删除windows服务\n");
    printf("\t-start      启动windows服务\n");
    printf("\t-stop       停止windows服务\n");
}
int main( int argc, char* argv[] )
{
    Init();

    dwThreadID = ::GetCurrentThreadId();
    SERVICE_TABLE_ENTRY st[] =
    {
        { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
        { NULL, NULL }
    };
    LPSTR lpCmdLine = argv[1];
    if ( argc == 2 )
    {
        BOOL bRet;
        if (stricmp(lpCmdLine, "-install") == 0)
        {
            bRet = InstallService();
            if ( bRet == TRUE )
            {
                Log( "Install service %s success", szServiceName );
            }else
            {
                Log( "Install service %s failed", szServiceName );
            }
        }
        else if (stricmp(lpCmdLine, "-uninstall") == 0)
        {
            bRet = UninstallService();
            if ( bRet == TRUE )
            {
                Log( "Uninstall service %s success", szServiceName);
            }else
            {
                Log( "Uninstall service %s failed[%d]", szServiceName,GetLastError());
            }
        }else if (stricmp(lpCmdLine, "-start") == 0)
        {
            bRet = ServiceCtrlStart();
            if ( bRet == TRUE )
            {
                Log( "Start service %s success", szServiceName );
            }else
            {
                Log( "Start service %s failed[%d]", szServiceName,GetLastError());
            }
        }else if (stricmp(lpCmdLine, "-stop") == 0)
        {
            bRet = ServiceCtrlStop();
            if ( bRet == TRUE )
            {
                Log( "Stop service %s success", szServiceName );
            }else
            {
                Log( "Stop service %s failed[%d]", szServiceName,GetLastError());
            }
        }
        else
        {
            Help();
        }

    }else
    {
        if (!::StartServiceCtrlDispatcher(st))
        {
                        Help();
        }
    }
    return 0;
}

//初始化相关结构
void Init()

{
    hServiceStatus = NULL;
    status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    status.dwCurrentState = SERVICE_STOPPED;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    status.dwWin32ExitCode = 0;
    status.dwServiceSpecificExitCode = 0;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
}

//服务主线程函数,既用户选择开启服务时调用的函数
void WINAPI ServiceMain()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    
    Log(_T("ServiceMain"));


    //注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
    if (hServiceStatus == NULL)
    {
        Log(_T("Handler not installed"));
        return;
    }
    SetServiceStatus(hServiceStatus, &status);


    ////如下代码可以为启动服务前的准备工作
    hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
    if ( hEvent == NULL )
    {
        status.dwCurrentState = SERVICE_STOPPED;
        SetServiceStatus(hServiceStatus, &status);
        Log(_T("Failure to start service[%d]"),GetLastError());
        return;
    }
    //更改服务状态为启动
    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
    status.dwCurrentState = SERVICE_RUNNING;
    SetServiceStatus(hServiceStatus, &status);
    //等待用户选择停止服务,
    //当然你也可以把你的服务代码用线程来执行,
    //此时这里只需等待线程结束既可。
    while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 )
    {
        //模拟服务的运行,应用时将主要任务放于此即可
        Log(_T("Service runing..."));
        WorkFun();
    }    

    //停止服务
    status.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hServiceStatus, &status);
    Log(_T("Service stopped"));

}

//服务控制函数

void WINAPI ServiceStrl(DWORD dwOpcode)

{
    switch (dwOpcode)
    {
    case SERVICE_CONTROL_STOP:
        status.dwCurrentState = SERVICE_STOP_PENDING;
        SetServiceStatus(hServiceStatus, &status);
        //告诉服务线程停止工作
        ::SetEvent( hEvent );
        Log(_T("want to stopped Service"));
        break;
    case SERVICE_CONTROL_PAUSE:
        break;
    case SERVICE_CONTROL_CONTINUE:
        break;
    case SERVICE_CONTROL_INTERROGATE:
        break;
    case SERVICE_CONTROL_SHUTDOWN:
        break;
    default:
        Log(_T("Bad service request"));
    }
}

//判断服务是否已安装
BOOL IsServiceInstalled()
{
    BOOL bResult = FALSE;
    //打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM != NULL)
    {
        //打开服务
        SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
        if (hService != NULL)
        {
            bResult = TRUE;
            ::CloseServiceHandle(hService);
        }
        ::CloseServiceHandle(hSCM);
    }
    return bResult;
}

//安装服务
BOOL InstallService()
{
    if (IsServiceInstalled())
        return TRUE;

    //打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        return FALSE;
    }
    // Get the executable file path
    TCHAR szFilePath[MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
    //创建服务
    SC_HANDLE hService = ::CreateService(
        hSCM,
        szServiceName,
        szServiceName,
        SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
        SERVICE_ERROR_NORMAL,
        szFilePath,
        NULL,
        NULL,
        _T(""),
        NULL,
        NULL);
    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        return FALSE;
    }
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}

//删除服务
BOOL UninstallService()
{
    if (!IsServiceInstalled())
        return TRUE;
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        return FALSE;
    }
    SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        return FALSE;
    }
    SERVICE_STATUS status;
    ::ControlService(hService, SERVICE_CONTROL_STOP, &status);
    //删除服务
    BOOL bDelete = ::DeleteService(hService);
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    if (bDelete)
        return TRUE;
    Log(_T("Service could not be deleted[%d]"),GetLastError());
    return FALSE;
}

//开启服务
BOOL ServiceCtrlStart()
{
    BOOL bRet;
    SC_HANDLE hSCM;
    SC_HANDLE hService;
    hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
    if (hSCM!=NULL)
    {
        hService=OpenService( hSCM, szServiceName, SERVICE_START);
        if (hService!=NULL)
        {
            //开始Service
            bRet = StartService(hService,0,NULL);
            CloseServiceHandle(hService);
        }else
        {
            bRet = FALSE;
        }
        CloseServiceHandle(hSCM);
    }else
    {
        bRet = FALSE;
    }
    return bRet;
}

//停止服务
BOOL ServiceCtrlStop()
{
    BOOL bRet;
    SC_HANDLE hSCM;
    SC_HANDLE hService;
    SERVICE_STATUS ServiceStatus;
    hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
    if (hSCM!=NULL)
    {
        hService=OpenService( hSCM, szServiceName, SERVICE_STOP|SERVICE_QUERY_STATUS );
        if (hService!=NULL)
        {
            QueryServiceStatus( hService, &ServiceStatus );
            if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
            {
                bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
            }else
            {
                bRet = FALSE;
            }
            CloseServiceHandle( hService );
        }else
        {
            bRet = FALSE;
        }
        CloseServiceHandle( hSCM );
    }else
    {
        bRet = FALSE;
    }
    return bRet;
}

int WorkFun()
{
       //workiing
    return 0;
}