Hi,

I want to ensure only the standard handles are inherited.

For Unix this seems to work fine with:

    QProcess::UnixProcessParameters params;
    params.flags = QProcess::UnixProcessFlag::CloseFileDescriptors;
    params.lowestFileDescriptorToClose = 0;
    m_process.setUnixProcessParameters(params);
    m_process.start(....

For Windows I tried something like:

https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873

via: (the UR_ENSURE stuff just checks if return value is sane)

    STARTUPINFOEX info;
    ZeroMemory(&info, sizeof(info));
m_process.setCreateProcessArgumentsModifier([&info](QProcess::CreateProcessArguments *args) {
        // only keep the handles that we have in args->startupInfo
        SIZE_T size = 0;
        LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList = NULL;
UR_ENSURE(InitializeProcThreadAttributeList(NULL, 1, 0, &size) || (GetLastError() == ERROR_INSUFFICIENT_BUFFER)); UR_ENSURE((lpAttributeList = reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(HeapAlloc(GetProcessHeap(), 0, size)))); UR_ENSURE(InitializeProcThreadAttributeList(lpAttributeList, 1, 0, &size)); HANDLE handlesToInherit[] = {args->startupInfo->hStdInput, args->startupInfo->hStdOutput, args->startupInfo->hStdError}; UR_ENSURE(UpdateProcThreadAttribute(lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_HANDLE_LIST, handlesToInherit, sizeof(handlesToInherit), NULL, NULL));

        info.StartupInfo = *(args->startupInfo);
        info.StartupInfo.cb = sizeof(info);
        info.lpAttributeList = lpAttributeList;
        args->flags |= EXTENDED_STARTUPINFO_PRESENT;
        args->startupInfo = &info.StartupInfo;
    });
    m_process.start(....

But with that I end up without any valid handles that can be used to get output from the QProcess m_process.

Any pointers how to do that correctly would be very welcome. (or if I just missed to used the proper Qt API for that)

Greetings
Christoph
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to