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);
}
Ejemplo n.º 2
0
bool QtServiceController::start(const QStringList &arguments)
{
    if (!isInstalled())
        return false;
    if (isRunning())
        return false;
    return QProcess::startDetached(serviceFilePath(), arguments);
}