关于win2000中的服务启动停止问题:
如何编程实现查询SNMP服务的目前状态?
如何编程实现启动SNMP服务,停止SNMP服务?我的程序调试结果是
当我调用StartService的时候,程序返回"Service start pending“;
也就是startService成功了,但是我看服务的当前状态(ssStatus.dwCurrentState)仍然是停止状态,因而程序运行到while循环的时候,也就没有进入循环。
为什么我的startService返回的服务状态不是SERVICE_START_PENDING,仍然是 SERVICE_STOPPED 0x00000001????
那位大虾能帮我解决这个问题阿?多谢了,老板催名阿
下面是我编写的代码,当启动服务的时候总是不能正常启动。
能否帮我看看代码
/*
*检测设备自动发现接口服务SNMP Service是否安装
*/
schSCManager = OpenSCManager(
NULL, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (schSCManager == NULL)
// this should never happens
fprintf(stderr,"OpenSCManager error");
schService = OpenService(
schSCManager, // SCManager database
"SNMP", // name of service
SERVICE_ALL_ACCESS); // need QUERY access
if (schService == NULL) {
time(&timer);
tm = localtime(&timer);
fprintf(stderr,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d 设备自动发现接口服务SNMP Service没有安装!请先安装该服务,设备自动发现接口才能正常启动.\n",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
}else{
/*
*检测设备自动发现接口服务SNMP Service是否启动,如果没有启动则启动
*/
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of status information structure
{
time(&timer);
tm = localtime(&timer);
fprintf(stderr,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d 查询设备自动发现接口SNMP服务状态信息出错.\n",tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
}
if (ssStatus.dwCurrentState == SERVICE_RUNNING ) {
//服务已经启动
time(&timer);
tm = localtime(&timer);
fprintf(stderr,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d 设备自动发现接口服务SNMP Service已经启动.\n",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
}else{
//服务没有启动,尝试启动服务
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{
fprintf(stderr,"StartService Error\n");
}else{
fprintf(stderr,"Service start pending.\n");
}
// 检查服务状态,直到服务不再开始Pending.
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of status information structure
{
fprintf(stderr,"QueryServiceStatus");
}
// Save the tick count and initial checkpoint.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
// Do not wait longer than the wait hint. A good interval is
// one tenth the wait hint, but no less than 1 second and no
// more than 10 seconds.
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;
Sleep( dwWaitTime );
// Check the status again.
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of structure
break;
if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
// The service is making progress.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
{
// No progress made within the wait hint
break;
}
}
}//end while
if (ssStatus.dwCurrentState == SERVICE_RUNNING)
{
printf("StartService SUCCESS.\n");
dwStatus = NO_ERROR;
}
else
{
printf("\nService not started. \n");
printf(" Current State: %d\n", ssStatus.dwCurrentState);
printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode);
printf(" Service Specific Exit Code: %d\n",
ssStatus.dwServiceSpecificExitCode);
printf(" Check Point: %d\n", ssStatus.dwCheckPoint);
printf(" Wait Hint: %d\n", ssStatus.dwWaitHint);
dwStatus = GetLastError();
}
CloseServiceHandle(schService);
}
}
如何编程实现查询SNMP服务的目前状态?
如何编程实现启动SNMP服务,停止SNMP服务?我的程序调试结果是
当我调用StartService的时候,程序返回"Service start pending“;
也就是startService成功了,但是我看服务的当前状态(ssStatus.dwCurrentState)仍然是停止状态,因而程序运行到while循环的时候,也就没有进入循环。
为什么我的startService返回的服务状态不是SERVICE_START_PENDING,仍然是 SERVICE_STOPPED 0x00000001????
那位大虾能帮我解决这个问题阿?多谢了,老板催名阿
下面是我编写的代码,当启动服务的时候总是不能正常启动。
能否帮我看看代码
/*
*检测设备自动发现接口服务SNMP Service是否安装
*/
schSCManager = OpenSCManager(
NULL, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (schSCManager == NULL)
// this should never happens
fprintf(stderr,"OpenSCManager error");
schService = OpenService(
schSCManager, // SCManager database
"SNMP", // name of service
SERVICE_ALL_ACCESS); // need QUERY access
if (schService == NULL) {
time(&timer);
tm = localtime(&timer);
fprintf(stderr,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d 设备自动发现接口服务SNMP Service没有安装!请先安装该服务,设备自动发现接口才能正常启动.\n",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
}else{
/*
*检测设备自动发现接口服务SNMP Service是否启动,如果没有启动则启动
*/
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of status information structure
{
time(&timer);
tm = localtime(&timer);
fprintf(stderr,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d 查询设备自动发现接口SNMP服务状态信息出错.\n",tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
}
if (ssStatus.dwCurrentState == SERVICE_RUNNING ) {
//服务已经启动
time(&timer);
tm = localtime(&timer);
fprintf(stderr,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d 设备自动发现接口服务SNMP Service已经启动.\n",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
}else{
//服务没有启动,尝试启动服务
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{
fprintf(stderr,"StartService Error\n");
}else{
fprintf(stderr,"Service start pending.\n");
}
// 检查服务状态,直到服务不再开始Pending.
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of status information structure
{
fprintf(stderr,"QueryServiceStatus");
}
// Save the tick count and initial checkpoint.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
// Do not wait longer than the wait hint. A good interval is
// one tenth the wait hint, but no less than 1 second and no
// more than 10 seconds.
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;
Sleep( dwWaitTime );
// Check the status again.
if (!QueryServiceStatus(
schService, // handle to service
&ssStatus) ) // address of structure
break;
if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
// The service is making progress.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
{
// No progress made within the wait hint
break;
}
}
}//end while
if (ssStatus.dwCurrentState == SERVICE_RUNNING)
{
printf("StartService SUCCESS.\n");
dwStatus = NO_ERROR;
}
else
{
printf("\nService not started. \n");
printf(" Current State: %d\n", ssStatus.dwCurrentState);
printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode);
printf(" Service Specific Exit Code: %d\n",
ssStatus.dwServiceSpecificExitCode);
printf(" Check Point: %d\n", ssStatus.dwCheckPoint);
printf(" Wait Hint: %d\n", ssStatus.dwWaitHint);
dwStatus = GetLastError();
}
CloseServiceHandle(schService);
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货