2010-03-23 9 views
6

Ich schreibe eine Art von IPC-Funktionalität und muss bestimmte Ressourcen von einem Prozess zum anderen übergeben. Dies funktioniert gut für Pipe-Griffe usw., die mit DuplicateHandle dupliziert werden können. Jetzt muss ich eine HDC von einem Prozess zum anderen weitergeben. Ist das überhaupt möglich? Wenn ja: Wie?Sharing HDC zwischen verschiedenen Prozessen

Sub-Frage: Ich gehe davon aus, Fenstergriffe (HWND) von einem Prozess zum anderen zu übergeben ist sicher. Ist diese Annahme richtig?

Antwort

6

Alle GDI-Handles werden in einer Tabelle gespeichert, die jedem Prozess zugeordnet ist. Die Einträge in der Tabelle enthalten die Prozess-ID des Besitzprozesses und dies wird bei jedem GDI-Zugriff auf das Handle überprüft.

Also, (ironisch), GDI behandelt - einschließlich HDCs - sind systemweit gültig. Aber kann nur von dem Prozess verwendet werden, der sie erstellt hat.


This Page dokumentiert die Prozessaffinität von GDI-Objekten. Natürlich, als ein Gegenpunkt ist es erwähnenswert, dass einige COM-Funktionen und Fenster Nachrichten wie WM_PRINT keine Interprozesseinschränkungen haben und sie sind HDC übergeben, so dass sie eindeutig etwas hinter den Kulissen tun müssen, um die HDC von einem Prozess zu marshallen zum nächsten.

+0

Ich denke, Sie und nobugz haben beide Recht mit der Betonung, dass mein Problem als GDI-Ressourcen im Allgemeinen geteilt angesehen werden kann. Ich habe einen verwandten Beitrag hier gefunden: http://stackoverflow.com/questions/133948/sharing-gdi-handles-between-processes-in-windows-ce-6-0 Dort möchte jemand HFONTs teilen. Vielleicht ist das die gleiche Liga wie HDCs. Aber wenn diese Tabelle in jedem Prozess abgebildet ist, dann wünschte ich, es gäbe eine einfache Funktion DuplicateGDIHandleFromThisTableForTheCurrentProcess ... –

+2

Die Tatsache, dass die Tabelle in allen Prozessen vorhanden ist, ist ein Artefakt der aktuellen Implementierung von GDI, kein Designmerkmal. Es kann weggehen. Und es gibt viele Fälle, in denen die GDI-Objekte Zeiger auf usermode-Datenstrukturen haben, so dass, obwohl das Handle systemweit gültig ist, das tatsächliche GDI-Objekt nur in einem einzigen Prozess erfolgreich zugegriffen werden kann. –

+0

Ok, was definitiv nicht funktioniert, ist, den gleichen Griff zu verwenden, ohne weiter in den anderen Prozess einzuordnen. Dies lässt die Frage offen, ob es eine öffentlich verfügbare Funktion dafür gibt ... –

8

HWNDs können zwischen Prozessen geteilt werden, SendMessage() würde sonst nicht funktionieren. Sie sind jedoch auf einen bestimmten Desktop beschränkt, ein Desktop ist einer Sitzung zugeordnet. Für jeden angemeldeten Benutzer gibt es eine Sitzung. Und Sitzung 0 ist speziell, die Sitzung, in der Dienste ausgeführt werden. Und es gibt einen sicheren Desktop, den Sie bei der Anmeldung sehen, oder wenn Sie Strg + Alt + Entf drücken, können Sie sich nicht mit dem Passworteingabefeld herumschlagen. Aber solange beide Prozesse auf demselben Desktop laufen, haben Sie keine Probleme.

HDCs sind trübe, nie versucht, dass. Ich würde es nicht empfehlen. Sie können immer eine von einem HWND mit GetDC() erstellen.

+0

SendMessage ist in der Tat ein gutes Beispiel, dass es zwischen Prozessen funktioniert (und meine Prozesse werden auf dem gleichen Desktop in der gleichen Sitzung ausgeführt werden). Vielen Dank. Mein Hauptanliegen sind also immer noch die HDCs. Du hast Recht, ich könnte die HWNDs bestehen, aber das bedeutet, dass ich Code umstrukturieren muss, den ich nicht anfassen will. Ich warte noch ein bisschen mehr, vielleicht weiß jemand von einem definitiven Ja oder Nein ... –

+0

warum versuchst du es nicht einfach? Wenn Sie den Code nicht umstrukturieren müssen, werden Sie schnell genug herausfinden. –

+1

Mh du hast hier einen Punkt. Aber selbst wenn es funktionierte, würde ich besser auf dokumentiertem Verhalten als auf Zufällen aufbauen, die es auf meinem Rechner funktionieren lassen, aber auf anderen brechen (es muss auch auf XP, Vista und 7 funktionieren). Aber es wird definitiv nicht schaden. Dann könnte ich zumindest lernen, dass es nicht funktioniert :) –

2

Angenommen, Sie möchten auf eine HDC zeichnen, die zu einem Prozess aus einem anderen Prozess gehört (z. B. mit BitBlt), wie von nobugz und Chris Becke ausgeführt, können Sie diese HDC nicht über Prozessgrenzen hinweg teilen. Nehmen wir jedoch an, dass die HDC dieses einen Prozesses zu einem Fenster gehört (und Sie beabsichtigen, endlich auf dieses Fenster zu zeichnen), dann können Sie dieses Fensterhandle an den anderen Prozess übergeben und in diesem Prozess GetDc verwenden, um eine HDC zu erhalten. Mit dieser HDC können Sie dann auf das Fenster des anderen Prozesses malen.