2010-03-23 9 views
6

Estoy escribiendo algún tipo de funcionalidad de IPC y necesito pasar ciertos recursos de un proceso a otro. Esto funciona bien para los identificadores Pipe, etc. que se pueden duplicar a través de DuplicateHandle. Ahora necesito pasar un HDC de un proceso al otro. ¿Esto es posible? Si es así: ¿cómo?Compartir HDC entre diferentes procesos

Sub-Pregunta: Estoy asumiendo que pasar identificadores de ventana (HWND) de un proceso a otro es seguro. ¿Es correcta esta suposición?

Respuesta

6

Todos los identificadores de GDI se almacenan en una tabla que se asigna a cada proceso. Las entradas de la tabla contienen la identificación del proceso del proceso de propiedad, y esto se comprueba en cada acceso de GDI al identificador.

Entonces, (irónicamente), los identificadores GDI, incluidos los HDC, son válidos para todo el sistema. Pero solo se puede usar desde el proceso que los creó.


This Page documenta el proceso de afinidad de objetos GDI. Por supuesto, como punto de contador, vale la pena señalar que algunas funciones COM, y los mensajes de ventana como WM_PRINT no tienen restricciones entre procesos y pasan HDC, por lo que claramente tienen que hacer algo detrás de las escenas para ordenar el HDC de un proceso a la próxima.

+0

Creo que tanto usted como Nobugz tienen razón al enfatizar que mi problema puede ser visto como un intercambio de recursos de GDI en general. Encontré una publicación relacionada aquí: http://stackoverflow.com/questions/133948/sharing-gdi-handles-between-processes-in-windows-ce-6-0 Alguien quiere compartir HFONTs. Tal vez esta es la misma liga que HDCs. Pero si hay una tabla asignada a cada proceso, me gustaría que hubiese una simple función DuplicateGDIHandleFromThisTableForTheCurrentProcess ... –

+2

El hecho de que la tabla exista en todos los procesos es un artefacto de la implementación actual de GDI, no una característica de diseño. Se puede ir. Y en muchos casos, los objetos GDI tienen punteros a las estructuras de datos del modo de usuario, de modo que, aunque el identificador es válido en todo el sistema, el objeto GDI real solo puede acceder con éxito en un solo proceso. –

+0

Ok, entonces lo que definitivamente no funcionará es usar el mismo identificador sin coordinar más con el otro proceso. Esto deja a la cuestión de si existe una función a disposición del público para hacer esto ... –

8

Los HWND se pueden compartir entre procesos, SendMessage() no funcionaría de lo contrario. Sin embargo, tienen un alcance para un escritorio específico, un escritorio está asociado a una sesión. Hay una sesión para cada usuario conectado. Y la sesión 0 es especial, la sesión en la que se ejecutan los servicios. Y hay un escritorio seguro, el que ve al iniciar sesión o cuando presiona Ctrl + Alt + Supr, no puede meterse con el cuadro de ingreso de la contraseña. Pero mientras ambos procesos se ejecuten en el mismo escritorio, no tendrás ningún problema.

HDCs son turbias, nunca lo intentaron. No lo recomendaría. Siempre puede crear uno desde un HWND con GetDC().

+0

SendMessage es de hecho un buen ejemplo de que tiene que funcionar entre procesos (y mis procesos se ejecutarán en el mismo escritorio en la misma sesión). Gracias. Entonces mi principal preocupación todavía son los HDC. Tienes razón, podría aprobar los HWND, pero eso significa que tendría que reestructurar el código que no quiero tocar. Solo espero un poco más, tal vez alguien sepa de un Sí o No definitivo ... –

+0

¿Por qué no lo intentas? Si no tiene que reestructurar el código, lo sabrá lo suficientemente rápido. –

+1

Mh, tienes un punto aquí. Pero incluso si funcionara, me sentiría mejor basándome en el comportamiento documentado en lugar de en la coincidencia, lo que podría hacer que funcione en mi máquina pero que rompa con otras (también tiene que funcionar en XP, Vista y 7). Pero intentarlo definitivamente no va a doler. Entonces, al menos, podría aprender que no funciona :) –

2

Suponiendo que desea pintar en un HDC perteneciente a un proceso de otro proceso (por ejemplo, mediante BitBlt), como nobugz y Chris Becke no puede compartir ese HDC a través de los límites del proceso. Pero, suponiendo además que el HDC de ese proceso pertenece a una ventana (y su intención es finalmente dibujar en esa ventana), puede pasar ese identificador de ventana al otro proceso y en este proceso usar GetDc para obtener un HDC. Con este HDC, puede pintar en la ventana del otro proceso.

Cuestiones relacionadas