#include bool ServiceControlManager::startService(const String &serviceName,Block &serviceArgs) { char **pArgs=(char**)0; DWORD access=0; bool retCode=false; if(!isOkay())return false; ServiceHandle serviceHandle; serviceHandle.setHandle(::OpenService(mServiceHandle.getHandle(),serviceName, SERVICE_PAUSE_CONTINUE|SERVICE_START|SERVICE_STOP),ServiceHandle::Delete); if(!serviceHandle.isOkay()) { mLastError=::GetLastError(); return retCode; } pArgs=new (char*[serviceArgs.size()]); for(int index=0;index dependencies; if(!isOkay())return false; csp.getNullSeparatedDependencies(dependencies); serviceHandle.setHandle(::CreateService(mServiceHandle.getHandle(),csp.getServiceName().str(), csp.getDisplayName().str(),csp.getDesiredAccess(),csp.getServiceType(), csp.getStartType(),csp.getErrorControl(),csp.getBinaryPathName().str(), csp.getLoadOrderGroup().isNull()?(char*)0:csp.getLoadOrderGroup().str(), 0,dependencies.size()?&dependencies[0]:0, csp.getServiceStartName().isNull()?(char*)0:csp.getServiceStartName().str(), csp.getPassword().isNull()?(char*)0:csp.getPassword().str()),ServiceHandle::Delete); if(!serviceHandle.isOkay())mLastError=::GetLastError(); return serviceHandle.isOkay(); } bool ServiceControlManager::deleteService(const String &serviceName) { bool retCode=false; if(!isOkay())return retCode; ServiceHandle serviceHandle; serviceHandle.setHandle(::OpenService(mServiceHandle.getHandle(),serviceName,DELETE),ServiceHandle::Delete); if(!serviceHandle.isOkay()) { mLastError=::GetLastError(); return retCode; } retCode=::DeleteService(serviceHandle.getHandle())?true:false; if(!retCode)mLastError=::GetLastError(); return retCode; } String ServiceControlManager::getLastErrorCode(void)const { switch(mLastError) { case ERROR_ACCESS_DENIED : return "ERROR_ACCESS_DENIED"; case ERROR_CIRCULAR_DEPENDENCY : return "ERROR_CIRCULAR_DEPENDENCY"; case ERROR_DUP_NAME : return "ERROR_DUP_NAME"; case ERROR_INVALID_HANDLE : return "ERROR_INVALID_HANDLE"; case ERROR_INVALID_NAME : return "ERROR_INVALID_NAME"; case ERROR_INVALID_PARAMETER : return "ERROR_INVALID_PARAMETER"; case ERROR_INVALID_SERVICE_ACCOUNT : return "ERROR_INVALID_SERVICE_ACCOUNT"; case ERROR_SERVICE_EXISTS : return "ERROR_SERVICE_EXISTS"; case ERROR_PATH_NOT_FOUND : return "ERROR_PATH_NOT_FOUND"; case ERROR_SERVICE_ALREADY_RUNNING : return "ERROR_SERVICE_ALREADY_RUNNING"; case ERROR_SERVICE_DATABASE_LOCKED : return "ERROR_SERVICE_DATABASE_LOCKED"; case ERROR_SERVICE_DEPENDENCY_DELETED : return "ERROR_SERVICE_DEPENDENCY_DELETED"; case ERROR_SERVICE_DEPENDENCY_FAIL : return "ERROR_SERVICE_DEPENDENCY_FAIL"; case ERROR_SERVICE_DISABLED : return "ERROR_SERVICE_DISABLED"; case ERROR_SERVICE_LOGON_FAILED : return "ERROR_SERVICE_LOGON_FAILED"; case ERROR_SERVICE_MARKED_FOR_DELETE : return "ERROR_SERVICE_MARKED_FOR_DELETE"; case ERROR_SERVICE_NO_THREAD : return "ERROR_SERVICE_NO_THREAD"; case ERROR_SERVICE_REQUEST_TIMEOUT : return "ERROR_SERVICE_REQUEST_TIMEOUT"; case ERROR_SERVICE_DOES_NOT_EXIST : return "ERROR_SERVICE_DOES_NOT_EXIST"; default : return String("WinError code:")+String().fromInt(mLastError); } }