8
votes

Partage de la HDC entre différents processus

J'écris une sorte de fonctionnalité de la CIP et je dois passer certaines ressources d'un processus à l'autre. Cela fonctionne bien pour les poignées, etc. qui peuvent être dupliqués via duplicatedhedle. Maintenant, j'ai besoin de passer un HDC d'un processus à l'autre. Est-ce seulement possible? Si oui: comment?

Sous-question: Je suppose que les poignées de fenêtre de passage (HWND) d'un processus à l'autre sont en sécurité. Cette hypothèse est-elle correcte?


0 commentaires

3 Réponses :


8
votes

HWNDS peut être partagé entre les processus, SendMessage () ne fonctionnerait pas autrement. Ils sont toutefois appliqués à un bureau spécifique, un bureau est associé à une session. Il y a une session pour chaque utilisateur connecté. Et la session 0 est spéciale, la session dans laquelle les services courent. Et il y a un bureau sécurisé, celui que vous voyez à la connexion ou lorsque vous appuyez sur CTRL + ALT + DEL, vous ne pouvez pas gâcher la zone d'entrée de mot de passe. Mais tant que les deux processus fonctionnent dans le même bureau, vous n'aurez aucun problème.

HDCS est trouble, n'a jamais essayé ça. Je ne le recommanderais pas. Vous pouvez toujours en créer un sur un HWND avec getDC ().


4 commentaires

SendMessage est en effet un bon exemple qu'il doit fonctionner entre les processus (et mes processus seront exécutés sur le même bureau de la même session). Merci. Mon principale préoccupation est donc toujours les HDCS. Vous avez raison, je pourrais passer les Hwnds, mais cela signifie que je devrais devoir restructurer le code que je ne veux pas toucher. J'attends juste un peu plus, peut-être que quelqu'un sait d'un oui ou d'une non ...


Pourquoi ne pas l'essayer juste? Si vous n'avez pas à restructurer le code, vous le découvrirez assez rapidement.


MH Vous avez un point ici. Mais même si cela a fonctionné, je me sentirais mieux de s'appuyer sur un comportement documenté plutôt que sur une coïncidence qui pourrait le faire fonctionner sur ma machine, mais une pause sur les autres (il doit également fonctionner sur XP, Vista et 7). Mais essayant définitivement ne sera pas blessé. Puis au moins je pouvais apprendre que cela ne fonctionne pas :)


J'ai eu le même problème. Posséda le HWND au lieu de HDC et créé un HDC de HWND. Et ça marche bien. Merci pour la pointe @hanspassant



7
votes

Toutes les poignées GDI sont stockées dans une table mappée dans chaque processus. Les entrées du tableau contiennent l'ID de processus du processus de possession, ce qui est vérifié sur chaque accès GDI à la poignée.

Donc, (ironiquement), gim poignées - y compris HDCS - sont valides du système valide. Mais ne peut être utilisé qu'à partir du processus qui les a créés.


Cette page documente l'affinité de processus de Objets GDI. Bien sûr, comme un comptoir, il convient de noter que certaines fonctions COM et que les messages de fenêtre tels que WM_Print n'ont pas de restrictions interprocesses et ils sont passés à HDC, ils doivent donc clairement faire quelque chose derrière les scènes pour le maréchal du processus HDC d'un processus à la suivante.


4 commentaires

Je pense que vous et Nobugz sont à la fois difficiles à souligner que mon problème peut être considéré comme partageant les ressources GDI en général. J'ai trouvé un message associé ici: Stackoverflow.com/Questtions/133948/... Voilà partager HFONTS. C'est peut-être la même ligue que les HDCS. Mais s'il y a cette table mappée dans chaque processus, je souhaite qu'il y ait une simple fonction DuplicateGDihandleFromThisTorthecurrentProcessingProcess ...


Le fait que la table existe dans tous les processus est un artefact de la mise en œuvre actuelle de GDI, et non d'une caractéristique de conception. Ça peut partir. Et ce sont de nombreux cas que les objets GDI ont des pointeurs sur des structures de données d'uermode afin que, même si la poignée soit valide Système, l'objet GDI ne peut être accessible que avec succès dans un seul processus.


Ok, de sorte que ce qui ne fonctionnera certainement pas est d'utiliser la même poignée sans augmenter d'autre côté dans l'autre processus. Cela laisse la question s'il existe une fonction accessible au public pour faire cela ...


+1 pour le pointage sur le MSDN qui indique en effet très clairement: "Les poignées aux objets GDI sont privées à un processus. C'est-à-dire que seul le processus créé l'objet GDI peut utiliser la poignée d'objet". Et il énumère également ce qu'il comprend par le terme «objet GDI». Merci encore!



3
votes

En supposant que vous souhaitez peindre sur un HDC appartenant à un processus d'un autre processus (par exemple en utilisant BitBlt), alors comme indiqué par Nobugz et Chris BeCke, vous ne pouvez pas partager que HDC entre les frontières du processus. Mais, en supposant en outre que le HDC de ce processus appartient à une fenêtre (et que votre intention est de tirer enfin de dessiner sur cette fenêtre), vous pouvez passer cette poignée de fenêtre à l'autre processus et utiliser GETDC pour obtenir un HDC. Avec ce HDC, vous pouvez ensuite peindre sur la fenêtre de l'autre processus.


0 commentaires