Windows API DuplicateHandle ()
http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx
Требует дублирования дескриптора объекта и дескриптора как исходного процесса, так и другого процесса, в котором вы хотите использовать дублированный дескриптор.
Я предполагаю, что, если у меня есть два НЕПРАВИЛЬНЫХ процесса, я могу вызвать DuplicateHandle () в любом из них, если у меня есть необходимые дескрипторы?
Мой вопрос касается использования канала для связи между двумя процессами для достижения этого с помощью события.
В первом процессе я создаю событие (). Теперь я хочу использовать WaitForSingleObject () во втором процессе.
Если я попытаюсь продублировать дескриптор в первом процессе, мне нужно будет сначала отправить второй дескриптор процесса в первый процесс через канал, продублировать дескриптор, а затем отправить дескриптор второму процессу?
Альтернативно, я мог бы начать с отправки дескриптора первого процесса и дескриптора события второму процессу и просто скопировать его там.
Есть ли причина, по которой я должен выбрать один из других?
Чтобы добавить складку, дескриптор Event фактически наследуется от родительского процесса, который фактически вызвал первый процесс (который является приложением CGI). Если этот дескриптор события был создан с помощью HANDLE_DO_NOT_DUPLICATE (что-то в этом роде), то могу ли я фактически использовать DuplicateHandle () для дублирования его для второго процесса?
Ответ:
Что ж, я мог бы создать новое событие NAMED в первом процессе и найти его во втором процессе, как было предложено, но я пытаюсь ДУБЛИРОВАТЬ событие, которое было создано в родительском элементе первого процесса, и перенаправить его во второй процесс. , Это событие не является именованным, поэтому мне нужно использовать DuplicateHandle ().
Я использую трубу для МПК. Я понимаю, что DuplicateHandle () придется вызывать в первом процессе, потому что дескриптор события находится вне контекста при отправке во второй процесс.
hProcPseudo = GetCurrentProcess()
//Then call either:
lpRealHandle = OpenProcess( PROCESS_DUP_HANDLE, 0, hProcPseudo )
//This fails with GetLastError= 87 - The parameter is incorrect ???
// same thing with PROCESS_ALL_ACCESS ??
//OR
lRet = DuplicateHandle( hProcPseudo, hProcPseudo, hProcPseudo, lpRealHandle, DUPLICATE_SAME_ACCESS, 0, 0 )
//then I can Duplicate my Event Handle in the first thread with:
lRet = DuplicateHandle( hLocalProcess, hEvent, lpRealHandle, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
Второй процесс преобразует свой дескриптор с помощью функции DuplicateHandle (), описанной выше при конвертации
hProcPseudo = 4294967295
до
hProcess = 152
Затем я передаю дескриптор этого процесса первому процессу через именованный канал.
В первом процессе (где дескриптор события действителен) я вызываю дубликат дескриптора:
DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
К сожалению, я получаю сообщение об ошибке:
DuplicateHandle hPipeFCGI GetLastError = 6 - дескриптор недействителен.
Дальнейшее тестирование (замена hFirstProcess) показывает, что hSecondProc является недействительным! ??
Большая Тайна.