我在调用 OpenService 和 ControlService 来启动和关闭一个服务的时候,这两个函数很快就返回了,但是服务好像还没有真正启动起来,如果这个时候,我再调用这两个函数启动或者关闭其他依存于刚才启动的那个服务的时候,就会报告“XXXX 内存不能read”这样的错误,请问我该怎么解决这个问题?是不是需要等待服务进行到某个状态的时候才能允许进行相关联的操作?最好能给出一段示范性的代码,出学VC6,概念性的东西领悟起来不是很快,谢谢!
调试欢乐多
服务本身的状态是由服务程序本身通知给"服务器控制器".
1:如果这个服务是你自己写的,你这个问题就不存在了.
2:在控制某个服务前,先读写这个服务当前的状态,然后再去控制.如:启动服务if( 服务停止 )
{
让其启动 while(当服务状态不为"已启动"时继续等待)
{
sleep(200);
继续取的服务状态
}
}
{
SC_HANDLE hSC = ::OpenSCManager( NULL,
NULL, GENERIC_EXECUTE);
if( hSC == NULL)
{
TRACE( "open SCManager error");
return;
}
SC_HANDLE hSvc = ::OpenService( hSC, "IBSservice",
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
TRACE( "Open www erron。");
::CloseServiceHandle( hSC);
return;
}
// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return;
}
if( status.dwCurrentState == SERVICE_STOPPED)
{
if( ::StartService( hSvc, NULL, NULL) == FALSE)
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return;
}
int nRetryTime = 5;
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
::Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_RUNNING)
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return;
}
if( nRetryTime-- < 0 )
{
break;
}
}
}
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return;
}
if ( !ControlService(
m_hSCService, // handle to service
SERVICE_CONTROL_STOP, // service status handle
&serStatus // status buffer
) )
{
…………
}
serStatus 和 m_hSCService 的定义如下:
SERVICE_STATUS serStatus;
SC_HANDLE m_hSCService;m_hSCService 已经调用 OpenService 了。
我跟了程序,就是这句的问题,但是不知道是那里错了?!谁帮我看一下,谢谢