请帮我看一下,我写了两个函数用来启动和停止服务,为什么我的函数在启动和停止服务的时候,比在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;
}
在线等,非常着急!!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;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货