#ifndef _WATCHDOG_SERVICECONTROLMANAGER_HPP_ #define _WATCHDOG_SERVICECONTROLMANAGER_HPP_ #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _WATCHDOG_SERVICEHANDLE_HPP_ #include #endif #ifndef _WATCHDOG_CREATESERVICEPARAMS_HPP_ #include #endif class ServiceControlManager { public: enum Access{Connect=SC_MANAGER_CONNECT,Enumerate=SC_MANAGER_ENUMERATE_SERVICE,QueryLock=SC_MANAGER_QUERY_LOCK_STATUS, ModifyBootConfig=SC_MANAGER_MODIFY_BOOT_CONFIG,StandardRightsRead=STANDARD_RIGHTS_READ, StandardRightsWrite=STANDARD_RIGHTS_WRITE,StandardRightsExecute=STANDARD_RIGHTS_EXECUTE, AllAccess=SC_MANAGER_ALL_ACCESS,CreateService=SC_MANAGER_CREATE_SERVICE, Lock=SC_MANAGER_LOCK}; ServiceControlManager(Access access=AllAccess,const String &machineName=String(),const String &databaseName=String()); virtual ~ServiceControlManager(); bool createService(CreateServiceParams &csp,ServiceHandle &serviceHandle); bool deleteService(const String &serviceName); bool startService(const String &serviceName,Block &serviceArgs=Block()); bool isOkay(void)const; String getLastErrorCode(void)const; private: ServiceHandle mServiceHandle; DWORD mLastError; }; inline ServiceControlManager::ServiceControlManager(Access access,const String &machineName,const String &databaseName) : mLastError(0) { mServiceHandle.setHandle(::OpenSCManager(machineName.isNull()?(char*)0:machineName.str(),databaseName.isNull()?(char*)0:databaseName.str(),access),ServiceHandle::Delete); if(!mServiceHandle.isOkay())mLastError=::GetLastError(); } inline ServiceControlManager::~ServiceControlManager() { } inline bool ServiceControlManager::isOkay(void)const { return mServiceHandle.isOkay(); } #endif