Кажется, что самый простой способ передать этот дескриптор - поместить дескриптор в аргументы командной строки CreateProcess
Это один способ сделать это, но это не только способ.
Другой простой способ - Parent
отправить свой идентификатор процесса с GetCurrentProcessId()
на Kid
, а затем Kid
может использовать OpenProcess()
, чтобы получить дескриптор к Parent
.
я никак не могу увидеть, как Ручка Родителя находится внутри Родителя.
GetCurrentProcess()
, который возвращает псевдо-дескриптор, представляющий вызывающий процесс. Все API, которые принимают дескриптор процесса, примут этот псевдо-дескриптор при использовании в контексте вызывающего процесса.
Но, для целей передачи дескриптора вызывающего процесса другому процессу, Parent
должен будет использовать DuplicateHandle()
для преобразования псевдо-дескриптора в реальный дескриптор (установите Parent
как исходный и целевой процессы). Это задокументированное поведение.
GetCurrentProcess
возвращает странное ненулевое значение, а DuplicateHandle
не работает без ручки малыша
После того, как Parent
продублирует псевдо-дескриптор из GetProcessHandle()
в реальный дескриптор, он может передать этот дубликат в Kid
в командной строке. Просто убедитесь, что дубликат является наследуемым, а затем используйте bInheritHandles=TRUE
в вызове CreateProcess()
или передайте STARTUPINFOEX
в CreateProcess()
, содержащий PROC_THREAD_ATTRIBUTE_HANDLE_LIST
(см. Программный контроль того, какие дескрипторы наследуются новыми процессами в Win32 ).
Невозможно, так как мне нужно создать Малыша, чтобы получить Ручку к нему
Если вы не хотите использовать наследуемые дескрипторы, то Parent
может альтернативно создать Kid
без передачи какого-либо дескриптора в командной строке, а затем дублировать псевдо-дескриптор GetCurrentProcess()
с Kid
в качестве целевого процесса. затем используйте выбранный вами механизм IPC, чтобы отправить дубликат на Kid
после его запуска.
но CreateProcess
- это также единственный шанс отправить ручку Родителя Малышу
Нет, это не только способ. МПК это другой способ.