Pregunta

La API de Windows DuplicateHandle () http://msdn.microsoft.com/en-us /library/ms724251(VS.85).aspx Requiere que el identificador del objeto esté duplicado y un identificador tanto para el proceso original Y el otro proceso en el que desea utilizar el identificador duplicado.

Supongo que si tengo dos procesos SIN CLASIFICAR, podría llamar a DuplicateHandle () en cualquiera de los dos, siempre y cuando tenga los identificadores necesarios disponibles.

Mi pregunta es sobre el uso de un Pipe para comunicarse entre los dos procesos para lograr esto con un Evento.

En el primer proceso I CreateEvent (). Ahora quiero usar WaitForSingleObject () en el segundo proceso.

Si intento duplicar el identificador en el primer proceso, primero tendré que enviar el segundo identificador del proceso al primer proceso a través de la tubería, duplicar el identificador y luego enviar el identificador al segundo proceso.

Alternativamente, podría comenzar enviando el primer identificador de proceso y el identificador de Evento al segundo proceso y simplemente duplicarlo allí.

¿Hay alguna razón por la que deba elegir una sobre la otra?

Para agregar una arruga, el controlador de eventos se hereda realmente del proceso principal que en realidad llamó el primer proceso (que es una aplicación CGI). Si ese identificador de evento se creó con HANDLE_DO_NOT_DUPLICATE (algo así), ¿puedo usar DuplicateHandle () para duplicarlo para el segundo proceso?

Respuesta:

Bueno, podría crear un nuevo evento NAMED en el primer proceso y encontrarlo en el segundo proceso como se sugiere, pero estoy tratando de DUPLICAR el evento que se creó en el padre del primer proceso y pasar al segundo proceso. . Este evento no es un evento con nombre, por lo que necesito usar DuplicateHandle ().

Estoy usando una tubería para el IPC. Me estoy dando cuenta de que se deberá llamar a DuplicateHandle () en el primer proceso porque el controlador de eventos está fuera de contexto cuando se envía al segundo proceso.

        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)

El segundo proceso convierte su identificador con DuplicateHandle () detallado anteriormente sobre la conversión

hProcPseudo = 4294967295

a

hProcess = 152

Luego paso este identificador de proceso al primer proceso a través de la canalización nombrada. En el primer proceso (donde el identificador de evento es válido), llamo identificador duplicado:

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

Desafortunadamente recibo el error:

DuplicateHandle hPipeFCGI GetLastError = 6: el identificador no es válido.

Pruebas adicionales (que sustituyen a hFirstProcess) revelan que es hSecondProc lo que no es válido. ??

Big Mystery.

¿Fue útil?

Solución

Use un canalización con nombre o < a href = "http://msdn.microsoft.com/en-us/library/aa365576(VS.85).aspx" rel = "nofollow noreferrer"> mailslots para IPC, esto debería funcionar de manera confiable para su propósito. Si necesita esperar, use los controladores de espera con nombre.

De lo contrario, elegiría hacer DuplicateHandle en el segundo proceso para establecer la propiedad del identificador correctamente.

Otros consejos

El identificador de proceso es diferente de la ID de proceso. OpenProcess toma la identificación del proceso. Usa algo como ...

HANDLE hProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE, GetCurrentProcessId ());

Si entendí correctamente, desea sincronizar dos procesos no relacionados a través del mismo evento. Si es así, puedes usar eventos con nombre.

Cree uno usando CreateEvent función de la API , déle un nombre, luego del segundo proceso use OpenEvent función API, especificando el nombre del evento.

Tiene funciones similares para otros objetos de sincronización, como mutexes ( OpenMutex ) o semáforos ( OpenSemaphore ) .

  1. De alguna manera, el segundo proceso debe llevar su ID de proceso al primer proceso. Esto se puede obtener a través de GetCurrentProcessId ()
  2. El primer proceso ahora necesita usar este ID para obtener un HANDLE para el segundo proceso: hProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE, dwProcessId);
  3. Ahora puede duplicar el identificador en el primer proceso, utilizando el identificador de proceso REAL del segundo proceso y el pseudo manejador del primer proceso: DuplicateHandle (GetCurrentProcess (), hEvent, hProcess, & amp; hDupEvent, 0, FALSO, DUPLICATE_SAME_ACCESS);
  4. Recuerda liberar el identificador que creaste con OpenProcess (no sé qué diferencia haría, pero se supone que debes ...). Además, libere AMBOS controladores para el evento: el que se asignó al segundo proceso y el controlador inicial.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top