DuplicateHandle (), использовать в первом или втором процессе?

Windows API DuplicateHandle ()http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx Требует дублирования дескриптора объекта и дескриптора как исходного процесса, так и другого процесса, в котором вы хотите использовать дублированный дескриптор.

Я предполагаю, что, если у меня есть два процесса UNRELATED, я мог бы вызвать DuplicateHandle () в любом из них, если у меня были доступны необходимые дескрипторы?

Мой вопрос касается использования канала для связи между двумя процессами для достижения этого с помощью события.

В первом процессе я CreateEvent (). Теперь я хочу использовать 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

Затем я передаю этот дескриптор процесса первому процессу через именованный канал. В первом процессе (где дескриптор события действителен) я вызываю Duplicate handle:

DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)

К сожалению, я получаю ошибку:

DuplicateHandle hPipeFCGI GetLastError = 6 - дескриптор недействителен.

Дальнейшее тестирование (замена hFirstProcess) показывает, что hSecondProc является недействительным! ??

Большая Тайна.

Ответы на вопрос(4)

Ваш ответ на вопрос