⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srvman32.cpp

📁 mini http server,可以集成嵌入到程序中,实现简单的web功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					"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 + -