请教关于启动和停止服务的问题?

clxye 2009-12-11 10:40:26
下面的这段代码,是我从网上找到的,在实际使用时有时候能够执行成功,有时候却执行失败(例如停止服务,程序状态有时候会处于一直停止服务,但很长时间服务就是停不下来),感觉不是很可靠,也不知道是哪个地方不够完善,麻烦大家帮忙看看。有时候启动服务也起不来。


bool StartServer( LPCSTR ServerName )
{
printf( "start %s service", ServerName );

// 打开服务管理对象
SC_HANDLE hSC = ::OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
if( hSC == NULL)
{
printf( "\nOpen SCManager error.\n");
return false;
}

// 打开服务
SC_HANDLE hSvc = ::OpenService( hSC, ServerName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP );
if( hSvc == NULL)
{
printf( "\nOpen %s error.\n", ServerName );
::CloseServiceHandle( hSC);
return false;
}

// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
printf( "\nGet Service state error.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}

// 如果处于停止状态则启动服务
if( status.dwCurrentState == SERVICE_STOPPED)
{
// 启动服务
if( ::StartService( hSvc, NULL, NULL) == FALSE)
{
printf( "\nstart service error.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}
// 等待服务启动
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
printf( "." );
::Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_RUNNING)
{
printf( "\tstart success.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}
}
printf( "\tstart %s error.\n", ServerName );
}
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);

return true;
}


bool StopServer( LPCSTR ServerName )
{
printf( "\nstop %s service", ServerName );

// 打开服务管理对象
SC_HANDLE hSC = ::OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
if( hSC == NULL)
{
printf( "\nOpen SCManager error.\n");
return false;
}

// 打开服务
SC_HANDLE hSvc = ::OpenService( hSC, ServerName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP );
if( hSvc == NULL)
{
printf( "\nOpen %s error.\n", ServerName );
::CloseServiceHandle( hSC);
return false;
}

// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
printf( "\nGet Service state error.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}

//如果处于运行状态则停止服务
if( status.dwCurrentState == SERVICE_RUNNING)
{
// 停止服务
if( ::ControlService( hSvc, SERVICE_CONTROL_STOP, &status) == FALSE)
{
printf( "\nstop service error.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}

// 等待服务停止
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
printf( "." );
::Sleep( 1000);
if( status.dwCurrentState == SERVICE_STOPPED)
{
printf( "\tstop success.");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return true;
}
}
printf( "\tstop %s error.", ServerName );
}
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);

return true;
}

...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
还没淹死的鱼 2009-12-11
  • 打赏
  • 举报
回复
mark

有空再看
qq14923349 2009-12-11
  • 打赏
  • 举报
回复
lz还在写网络啊?
建议用现成的CSOCKET

SOCKET原始套节字除非有代码否则调试调到你吐血
clxye 2009-12-11
  • 打赏
  • 举报
回复
服务是别人写的,应该是没问题的。通过手动停止启动都没问题的。
后来我给了个写法,感觉效果更好点。


bool StartServer( LPCSTR ServerName )
{
char szCmd[MAX_PATH] = "net start ";
strcat( szCmd, ServerName );

// 打开服务管理对象
SC_HANDLE hSC = ::OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
if( hSC == NULL)
{
printf( "Open SCManager error.\n");
return false;
}

// 打开服务
SC_HANDLE hSvc = ::OpenService( hSC, ServerName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP );
if( hSvc == NULL)
{
printf( "Open %s error.\n", ServerName );
::CloseServiceHandle( hSC);
return false;
}

// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
printf( "Get Service state error.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}

if( status.dwCurrentState == SERVICE_RUNNING )
{
printf( "Service %s is running already.\n", ServerName );
return true;
}
// 如果处于停止状态则启动服务
else if( status.dwCurrentState == SERVICE_STOPPED)
{
// 启动服务
system( szCmd );

// 等待服务启动
if( ::QueryServiceStatus( hSvc, &status ) == TRUE )
{
if( status.dwCurrentState == SERVICE_RUNNING)
{
printf( "Start %s success.\n", ServerName );
::CloseServiceHandle( hSvc );
::CloseServiceHandle( hSC );
return true;
}
}
printf( "Start %s failed.\n", ServerName );
}
::CloseServiceHandle( hSvc );
::CloseServiceHandle( hSC );

return false;
}

bool StopServer( LPCSTR ServerName )
{
char szCmd[MAX_PATH] = "net stop ";
strcat( szCmd, ServerName );
printf( "Stop %s service", ServerName );

// 打开服务管理对象
SC_HANDLE hSC = ::OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
if( hSC == NULL)
{
printf( "Open SCManager error.\n");
return false;
}

// 打开服务
SC_HANDLE hSvc = ::OpenService( hSC, ServerName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP );
if( hSvc == NULL)
{
printf( "Open %s error.\n", ServerName );
::CloseServiceHandle( hSC );
return false;
}

// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
printf( "Get Service state error.\n");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return false;
}

//如果处于运行状态则停止服务
if( status.dwCurrentState == SERVICE_STOPPED )
{
printf( "Service %s has stopped already.\n", ServerName );
return true;
}
if( status.dwCurrentState == SERVICE_RUNNING)
{
// 停止服务
system( szCmd );

// 等待服务停止
if( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
if( status.dwCurrentState == SERVICE_STOPPED)
{
printf( "Stop service %s success.\n", ServerName );
::CloseServiceHandle( hSvc );
::CloseServiceHandle( hSC );
return true;
}
}
printf( "Stop Service %s failed.\n", ServerName );
}
::CloseServiceHandle( hSvc );
::CloseServiceHandle( hSC );

return false;
}
coyer 2009-12-11
  • 打赏
  • 举报
回复
被操纵的服务是你自己写的还是系统本身的服务?

系统本身的服务,一般不会有你说的问题,如果你自己写的服务,就需要检查了。运行过程中不断写日志,检查日志。

以上是代码直接操作,也可以使用 exec 执行命令行来启动服务的 net start ...
clxye 2009-12-11
  • 打赏
  • 举报
回复
没有操作的,执行有时候成功有时候失败。
以前在我本机基本都是成功的,后来放到其他人机器上,失败的几率是非常大的。
lovezha1028 2009-12-11
  • 打赏
  • 举报
回复
这段代码没有问题,服务停止不了会不会是你所操作服务的问题呢?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧