请帮我看一下,我写了两个函数用来启动和停止服务,为什么我的函数在启动和停止服务的时候,比在Windows服务管理器(Services.msc)中启动和停止服务慢很多,这是为什么??
    在线等,非常着急!!BOOL ServerControl::RunService(CString serName, SERVICE_STATUS serStatus)  // 启动服务
{
// TODO: Add your control notification handler code here

// Get a handle to the SCM database. 
m_hSCManager = OpenSCManager(NULL, NULL, GENERIC_EXECUTE ); 

if ( NULL == m_hSCManager )
{
return FALSE;
}

m_hSCService = OpenService( m_hSCManager, serName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);

if ( NULL == m_hSCService )
    {
        ::CloseServiceHandle(m_hSCManager);
        return FALSE;
    }     if( ::QueryServiceStatus( m_hSCService, &serStatus) == FALSE)
    {
TRACE( "Get Service state error, error number: (%d)\n", GetLastError() );
        ::CloseServiceHandle( m_hSCService);
        ::CloseServiceHandle( m_hSCManager);
        return FALSE;
    } if( serStatus.dwCurrentState == SERVICE_STOPPED)
{
if ( ::StartService( m_hSCService, NULL, NULL ) == FALSE )
{
TRACE( "start service error, error number: (%d)\n", GetLastError());
::CloseServiceHandle ( m_hSCService );
::CloseServiceHandle( m_hSCManager );
return FALSE;
}  while( ::QueryServiceStatus( m_hSCService, &serStatus) == TRUE)
{
::Sleep(serStatus.dwWaitHint);
if ( serStatus.dwCurrentState == SERVICE_RUNNING)
{
::CloseServiceHandle ( m_hSCService ); 
::CloseServiceHandle( m_hSCManager );
return TRUE;
}
}
}
TRACE( "start service error, error number: (%d)\n", GetLastError());
::CloseServiceHandle ( m_hSCService ); 
::CloseServiceHandle( m_hSCManager );
return FALSE;
}BOOL ServerControl::StopService(CString serName, SERVICE_STATUS serStatus)   //停止服务
{
// TODO: Add your control notification handler code here

m_hSCManager = OpenSCManager( NULL, NULL, GENERIC_EXECUTE ); 

if ( NULL == m_hSCManager )
{
return FALSE;
}

m_hSCService = OpenService( m_hSCManager, serName, SERVICE_STOP | SERVICE_START | SERVICE_QUERY_STATUS);

if ( NULL == m_hSCService )
{
         ::CloseServiceHandle(m_hSCManager);
        return FALSE;
}     if( ::QueryServiceStatus( m_hSCService, &serStatus) == FALSE)
{
TRACE( "Get Service state error, error number: (%d)\n", GetLastError());
        ::CloseServiceHandle( m_hSCService);
        ::CloseServiceHandle( m_hSCManager);
        return FALSE;
}

if( serStatus.dwCurrentState == SERVICE_RUNNING)
{
if ( ::ControlService( m_hSCService, SERVICE_CONTROL_STOP, &serStatus ) == FALSE )
{
::CloseServiceHandle ( m_hSCService );
::CloseServiceHandle( m_hSCManager );
return FALSE;
} while( ::QueryServiceStatus( m_hSCService, &serStatus) == TRUE)
{
::Sleep(serStatus.dwWaitHint);
if ( serStatus.dwCurrentState == SERVICE_STOPPED )
{
::CloseServiceHandle ( m_hSCService );
::CloseServiceHandle( m_hSCManager );
return TRUE;
}
}
}
::CloseServiceHandle ( m_hSCService ); 
::CloseServiceHandle( m_hSCManager );
return FALSE;
}