void WINAPI winServiceMain(DWORD, LPTSTR *) { QString serviceName = enumerateService(GetCurrentProcessId()); statusHandle = RegisterServiceCtrlHandler((const wchar_t*)serviceName.utf16(), serviceHandler); if (!statusHandle) return; // Service status serviceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(statusHandle, &serviceStatus); // Main function int ret = 1; QString binary = serviceFilePath(serviceName); if (!binary.isEmpty()) { const char *args[1] = { binary.toStdString().c_str() }; try { QDir::setCurrent(QFileInfo(binary).absolutePath()); ret = managerMain(1, (char**)args); } catch (...) { } } // Service status serviceStatus.dwCurrentState = SERVICE_STOPPED; serviceStatus.dwWin32ExitCode = ret; SetServiceStatus(statusHandle, &serviceStatus); }
bool QtServiceController::start(const QStringList &arguments) { if (!isInstalled()) return false; if (isRunning()) return false; return QProcess::startDetached(serviceFilePath(), arguments); }