У меня есть приложение, которое порождает несколько потоков CreateProcess , и я успешно перенаправляю вывод stdout и stderr в текстовые файлы для каждого.
Однако я обнаружил эту функцию посредством чего дескрипторы stdout / strderr наследуются всеми такими потоками, а не только теми, которые я хочу, чтобы они наследовали. Итак, я отправился в путь, чтобы использовать InitializeProcThreadAttributeList , UpdateProcThreadAttribute функций и EXTENDED_STARTUPINFO_PRESENT и STARTUPINFOEX в Функция CreateProcess , чтобы обойти это, но я застрял.
Если я использую PROC_THREAD_ATTRIBUTE_HANDLE_LIST в качестве аргумента Атрибут в UpdateProcThreadAttribute , процедура ожидает, что параметр lpValue будет указателем на список дескрипторов, которые должны наследоваться дочерним процессом .
Для списка, который я пробовал использовать
TList<Cardinal>
, а также создать массив кардиналов, но не смог получить Подходы к компиляции!
Вопрос: Как мне создать и заполнить такой список?
Во-вторых, в этом примере он использует функции и процедуры из kernel32.dll но они также существуют в модуле Windows (я использую Delphi 10.3), хотя определения отличаются:
Например, InitializeProcThreadAttributeList( nil, 1, 0, vAListSize );
не будет компилироваться с использованием модуля Windows из-за аргумент nil, потому что Типы фактических и формальных параметров var должны быть идентичны , но у меня нет такой проблемы с использованием проблемы в kernel32
Вопрос: Какую версию этих функций / процедур мне следует Вы используете?
Спасибо.