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); }
void WINAPI winServiceMain(DWORD, LPTSTR *) { auto serviceName = getServiceName(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 pathstr = getServiceFilePath(serviceName); if (!pathstr.isEmpty()) { auto argList = parseArguments(pathstr); auto *args = new char*[argList.count()]; for (int i = 0; i < argList.count(); i++) { args[i] = argList[i].data(); } ret = managerMain(argList.count(), args); delete[] args; } // Cleanup code must be executed before setting status to SERVICE_STOPPED tSystemInfo("Windows service stopped"); Tf::releaseSystemLogger(); // Service status serviceStatus.dwCurrentState = SERVICE_STOPPED; serviceStatus.dwWin32ExitCode = ret; SetServiceStatus(statusHandle, &serviceStatus); }