📄 srvman32.cpp
字号:
"SOFTWARE\\Pi3\\Pi3Svc" ) == ERROR_SUCCESS )
{
if ( RegDeleteKey( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Pi3" ) != ERROR_SUCCESS )
{
PIOStrStream os;
os << "Could not delete registry key for service with name '\
" << sServiceName << "'; Win32Error #" << GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
}
}
else
{
PIOStrStream os;
os << "Could not delete registry key for service with name '\
" << sServiceName << "'; Win32Error #" << GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
}
};
}
else if ( sCommand == VALUE_STARTCOMMAND )
{
SC_HANDLE schService = OpenService(
schSCManager,
TEXT(sServiceName),
SERVICE_START | SERVICE_QUERY_STATUS );
if ( !schService )
{
PIOStrStream os;
os << "Could not open service '" << sServiceName << "' for \
start operation; Win32Error #" << GetLastError() << ends;
CONFIG_ERR( pObject, os.str() );
iRet = PIAPI_ERROR;
}
else if ( !StartService( schService, 0, NULL ) )
{
PIOStrStream os;
os << "Could not start service '" << sServiceName << "'; \
Win32Error #" << GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
}
else
{
/* --- track service from PENDING thru RUNNING --- */
SERVICE_STATUS ssStatus;
DWORD dwOldCheckPoint;
if ( !QueryServiceStatus( schService, &ssStatus ) )
{
PIOStrStream os;
os << "Could not get status for service '"
<< sServiceName << "'; Win32Error #"
<< GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
};
while( iRet==PIAPI_COMPLETED &&
ssStatus.dwCurrentState != SERVICE_RUNNING )
{
dwOldCheckPoint = ssStatus.dwCheckPoint;
Sleep( ssStatus.dwWaitHint );
if ( !QueryServiceStatus( schService, &ssStatus ) )
{
PIOStrStream os;
os << "Could not get status for service '"
<< sServiceName << "'; Win32Error #"
<< GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
break;
};
if ( ssStatus.dwCurrentState != SERVICE_RUNNING &&
dwOldCheckPoint >= ssStatus.dwCheckPoint )
{
PIOStrStream os;
os << "Failed to start service '"
<< sServiceName << "'" << ends;
CONFIG_ERR( pObject, os.str() );
iRet = PIAPI_ERROR;
break;
};
}; /* --- service state is still 'pending' --- */
}; /* --- StartService() succeeded --- */
if ( schService )
{ CloseServiceHandle( schService ); };
}
else if ( sCommand == VALUE_STOPCOMMAND )
{
SC_HANDLE schService = OpenService(
schSCManager,
TEXT(sServiceName),
SERVICE_STOP );
SERVICE_STATUS ssStatus;
if ( !schService )
{
PIOStrStream os;
os << "Could not open service '" << sServiceName << "' for \
stop operation; Win32Error #" << GetLastError() << ends;
CONFIG_ERR( pObject, os.str() );
iRet = PIAPI_ERROR;
}
else if ( !ControlService( schService, SERVICE_CONTROL_STOP,
&ssStatus ) )
{
PIOStrStream os;
os << "Could not stop service '" << sServiceName << "'; \
Win32Error #" << GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
};
if ( schService )
{ CloseServiceHandle( schService ); };
}
else if ( sCommand == VALUE_CHECKCOMMAND )
{
SC_HANDLE schService = OpenService(
schSCManager,
TEXT(sServiceName),
SERVICE_QUERY_STATUS );
SERVICE_STATUS ssStatus;
if ( !schService )
{
PIOStrStream os;
os << "Could not open service '" << sServiceName << "' for \
status operation; Win32Error #" << GetLastError() << ends;
CONFIG_ERR( pObject, os.str() );
iRet = PIAPI_ERROR;
}
else
{
/* --- track service from PENDING thru RUNNING --- */
bool bRunning = false;
SERVICE_STATUS ssStatus;
DWORD dwOldCheckPoint;
if ( !QueryServiceStatus( schService, &ssStatus ) )
{
if ( GetLastError()==ERROR_SERVICE_NOT_ACTIVE )
{ bRunning = false; }
else
{
/* --- other error --- */
PIOStrStream os;
os << "Could not get status for service '"
<< sServiceName << "'; Win32Error #"
<< GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
};
}
else
{ bRunning = true; };
/* --- track pending states --- */
while( bRunning && iRet==PIAPI_COMPLETED &&
( ssStatus.dwCurrentState == SERVICE_START_PENDING ||
ssStatus.dwCurrentState == SERVICE_STOP_PENDING ) )
{
dwOldCheckPoint = ssStatus.dwCheckPoint;
Sleep( ssStatus.dwWaitHint );
if ( !QueryServiceStatus( schService, &ssStatus ) )
{
PIOStrStream os;
if ( GetLastError()==ERROR_SERVICE_NOT_ACTIVE )
{ bRunning = false; break; };
/* --- other error --- */
os << "Could not get status for service '"
<< sServiceName << "'; Win32Error #"
<< GetLastError() << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
break;
};
if ( ssStatus.dwCurrentState != SERVICE_RUNNING &&
dwOldCheckPoint >= ssStatus.dwCheckPoint )
{
PIOStrStream os;
os << "Service '" << sServiceName << "' stalled."
<< ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
break;
};
}; /* --- service state is still 'pending' --- */
if ( bRunning && iRet==PIAPI_COMPLETED &&
ssStatus.dwCurrentState != SERVICE_RUNNING &&
ssStatus.dwCurrentState != SERVICE_PAUSED )
{ bRunning = false; };
if ( iRet==PIAPI_COMPLETED )
{
if ( bRunning )
{ cout << "Yes"; }
else
{ cout << "No"; };
};
}; /* --- OpenService() succeeded --- */
if ( schService )
{ CloseServiceHandle( schService ); };
}
else
{
PIOStrStream os;
os << "Unknown command '" << sCommand << "'" << ends;
CONFIG_ERR(pObject, os.str() );
iRet = PIAPI_ERROR;
};
return iRet;
};
inline int IsOK() { return bOK; };
};
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Pi3ServiceManager_onClassLoad( PIClass_LoadAction eLoad,
void * )
{
switch( eLoad )
{
case STARTUP:
default:;
};
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Pi3ServiceManager_constructor( PIObject *pObj,
int iArgc, const char *ppArgv[] )
{
Pi3ServiceManager *pManager = new Pi3ServiceManager( pObj,
iArgc, ppArgv );
if (!( pManager && pManager->IsOK() ) )
{
delete pManager;
return PIAPI_ERROR;
};
if ( PIObject_setUserData( pObj, pManager ) )
{
CONFIG_ERR( pObj,
"Pi3ServiceManager_constructor: PIObject_setUserData() failed" );
return PIAPI_ERROR;
};
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Pi3ServiceManager_copyConstructor( PIObject *, int,
const char *[] )
{
/* --- don't support copy constructor --- */
return PIAPI_ERROR;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Pi3ServiceManager_destructor( PIObject *pObj )
{
delete (Pi3ServiceManager *)PIObject_getUserData( pObj );
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function:
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Pi3ServiceManager_execute( PIObject *pObj, int iArgc,
const char *ppArgv[] )
{
return ((Pi3ServiceManager *)PIObject_getUserData( pObj ))
->Execute( iArgc, ppArgv );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -