Können sich zwei Prozesse eine DLL teilen?
-
Hallo, ist es möglich zwei Prozesse zu starten, die sich die selbe DLL teilen? Soweit ich weiß werden gleiche DLLs mehrfach pro Prozess geladen und nicht geteilt...
Ich würde gerne über die DLL einen Funktionszeiger aus dem anderen Prozess erhalten und aufrufen.
Konkret möchte ich eine OpenGL Zeichenroutine aus Prozess B in Prozess A zeichnen.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
storm009 schrieb:
Hallo, ist es möglich zwei Prozesse zu starten, die sich die selbe DLL teilen? Soweit ich weiß werden gleiche DLLs mehrfach pro Prozess geladen und nicht geteilt...
Ich würde gerne über die DLL einen Funktionszeiger aus dem anderen Prozess erhalten und aufrufen.
Konkret möchte ich eine OpenGL Zeichenroutine aus Prozess B in Prozess A zeichnen.Da mangelt es an grundlegendem Verständnis zu DLLs. Du wärst gut damit beraten dir erst einmal etwas Lektüre über DLLs zuzulegen.
-
Tippgeber schrieb:
Da mangelt es an grundlegendem Verständnis zu DLLs. Du wärst gut damit beraten dir erst einmal etwas Lektüre über DLLs zuzulegen.
Bitte nicht so streng sein! Es ist der Sinn von DLLs, dass sich mehrere Prozesse diese teilen können. Geteilt wird aber nur der Code, die Daten bleiben sauber getrennt. Die Frage läuft aus Inter-Process-Communication (IPC) hinaus und hat zunächst mit DLLs nichts zu tun.
-
Huch?
So wie ich das verstehe will er die DLL verwenden um einen Funktionszeiger zu "marshallen", und dann im anderen Prozess zu verwenden.
Das geht so nicht.
Das ginge - wenn überhaupt - nur dann, wenn die Funktion um die es sich handelt in der DLL implementiert ist.
Und man hat eben das Problem mit den Daten.
Eine "OpenGL Zeichenroutine" braucht meist komplexe Datenstrukturen, plus: sie wird wohl einen OpenGL Kontext brauchen. Und soweit ich weiss kann man einen OpenGL Kontext nicht zwischen Prozessen sharen (geht ja nichtmal zwischen zwei Threads des gleichen Prozesses).
-
Danke für die Antworten. Richtige Erfahrung mit DLLs hab ich wirklich noch nicht. Die Sache mit dem OpenGL Kontext ist mir bekannt. Der zweite Prozess sollte auch keinen OpenGL Kontext erzeugen. Ich habe mir aber schon gedacht, dass das zu einfach wäre. Mit IPC habe ich das einmal umgesetzt, allerdings kostet das hin und her kopieren der Bilddaten ziemlich viel Performance.
-
Dann hijacke die Addressen und manipuliere sie direkt.
Ist dann allerdings sehr dreckiger Code und es ist fraglich ob der dann auf zukünftigen Windows Versionen oder Wine läuft.
-
storm009 schrieb:
Danke für die Antworten. Richtige Erfahrung mit DLLs hab ich wirklich noch nicht. Die Sache mit dem OpenGL Kontext ist mir bekannt. Der zweite Prozess sollte auch keinen OpenGL Kontext erzeugen. Ich habe mir aber schon gedacht, dass das zu einfach wäre. Mit IPC habe ich das einmal umgesetzt, allerdings kostet das hin und her kopieren der Bilddaten ziemlich viel Performance.
Du kannst die Daten statt zu kopieren auch in shared-Memory anlegen. Oder vielleicht sogar nur in dem Zeichenprozess und im anderen Prozess darauf nur handles zu halten. Ohne deinen Einsatzzweck zu kennen, ist es natürlich schwierig dir weiterzuhelfen.
-
storm009 schrieb:
Hallo, ist es möglich zwei Prozesse zu starten, die sich die selbe DLL teilen? Soweit ich weiß werden gleiche DLLs mehrfach pro Prozess geladen und nicht geteilt...
grundsaetzlich versucht windows erstmal dlls nur einmal zu laden, falls aber ein addressraum konflickt auftaucht (also der speicherbereich in einer aplikation fuer andere dinge benutzt wird), wird die dll an eine andere stelle geladen.
Ich würde gerne über die DLL einen Funktionszeiger aus dem anderen Prozess erhalten und aufrufen.
wenn du vorher verifizierst, dass beide prozesse die selbe dll nutzen, geht das. z.b. erstmal alle function-pointer durchgehen und addressen vergleichen.
Konkret möchte ich eine OpenGL Zeichenroutine aus Prozess B in Prozess A zeichnen.
bedenke, der context von opengl ist thread gebunden, du koenntest also nichtmal im selben prozess von mehreren threads drauf zugreifen (jedenfalls nicht ohne risiko, dass es irgendwo mal schief geht).
-
Frage zum besseren Verständnis: Geht es nur darum, das Arbeitsergebnis (ein Pixelbild?) von Prozess A im Prozess B sichtbar zu machen? Oder soll der Prozess B daran mit OpenGL eigenständig auch weiterarbeiten können? Erkläre bitte mehr und versuche das erst ohne DLL sauber zu lösen. Steht die Lösung kriegt man die DLL im 2. Schritt dafür auch hin.
-
Ok ich hole ein wenig weiter aus. Zur Zeit habe ich einen Appmanager, der andere kleine Apps dynamisch laden und ausführen kann. Die Apps sind nichts weiter als DLLs und das funktioniert auch wunderbar. Mein eigentliches Problem besteht im Ladevorgang der DLL. Sobald ich eine DLL lade friert Windows anscheinend den gesamten Prozess ein. Bei größeren Apps friert die Anwendung für 2-3 Sekunden ein, was nicht schön ist. Ich dachte ich könnte den Ladevorgang in einen Thread auslagern aber anscheinend ist das nicht möglich. Deshalb wollte ich die App aus dem Appmanager als einen weiteren Prozess starten und mir dessen Zeichenroutinen besorgen.
-
storm009 schrieb:
Ok ich hole ein wenig weiter aus. Zur Zeit habe ich einen Appmanager, der andere kleine Apps dynamisch laden und ausführen kann. Die Apps sind nichts weiter als DLLs und das funktioniert auch wunderbar. Mein eigentliches Problem besteht im Ladevorgang der DLL. Sobald ich eine DLL lade friert Windows anscheinend den gesamten Prozess ein. Bei größeren Apps friert die Anwendung für 2-3 Sekunden ein, was nicht schön ist. Ich dachte ich könnte den Ladevorgang in einen Thread auslagern aber anscheinend ist das nicht möglich. Deshalb wollte ich die App aus dem Appmanager als einen weiteren Prozess starten und mir dessen Zeichenroutinen besorgen.
Wer programmiert diese Apps/DLLs? Du? Ich habe so eine Ahnung...
-
Ja, sowohl Appmanager als auch Apps sind von mir. Verstehe ich nicht mit deiner Ahnung ...
-
storm009 schrieb:
Ja, sowohl Appmanager als auch Apps sind von mir. Verstehe ich nicht mit deiner Ahnung ...
Ich kann mich halt auch nur wiederholen
Tippgeber schrieb:
Da mangelt es an grundlegendem Verständnis zu DLLs. Du wärst gut damit beraten dir erst einmal etwas Lektüre über DLLs zuzulegen.
-
storm009 schrieb:
Sobald ich eine DLL lade friert Windows anscheinend den gesamten Prozess ein.
Nö, gar nicht.
Deshalb wollte ich die App aus dem Appmanager als einen weiteren Prozess starten und mir dessen Zeichenroutinen besorgen.
Hast du es probiert/wo ist das Problem?
Es gibt eine "Engstelle", nämlich den prozessweiten Lock beim DLL Laden (bzw. initialisieren - DllMain halt). D.h. du kannst nicht zwei DLLs gleichzeitig laden (initialisieren).
Andere Threads, die andere Dinge tun, werden dabei aber nicht ausgebremst.
-
Es gibt eine "Engstelle", nämlich den prozessweiten Lock beim DLL Laden (bzw. initialisieren - DllMain halt). D.h. du kannst nicht zwei DLLs gleichzeitig laden (initialisieren).
Andere Threads, die andere Dinge tun, werden dabei aber nicht ausgebremst.Vielen Dank, du hast mir sehr geholfen! Durch deinen Tipp habe ich gelesen, dass zum laden einer DLL der erste Thread vom Prozess verwendet wird.
Ich habe versucht den Ladevorgang in einen Thread auszulagern, was nichts gebracht hat. Wenn ich stattdessen meine Zeichenroutinen nicht im Hauptthread laufen lasse, stockt die Anwendung auch nicht mehr.
-
Wo hast du das denn gelesen?
Wäre mir neu.
Es wird der Thread verwendet der LoadLibrary() aufruft.
-
jaja ich merke schon, dass Tippgeber recht hatte
in meinem Dokument, welches ich im Internet gefunden habe stand
for each loaded DLL using the first thread of the process
Hab es wohl missverstanden und du hast natürlich mit allem recht.
Ich benutze OpenGL mit GLUT und nachdem ich meine Callbacks wieder eingebaut hatte trat das selbe Problem erneut auf. Es hängt irgendwie mit GLUT zusammen. Sobald ich die Funktion glutSwapBuffer aufrufe friert die Anwendung ein, solange die DLL geladen wird. Und es spielt keine Rolle welche Funktionen ich in Threads auslager... aber immer hin hab ich einen neuen Anhaltspunkt, wonach ich suchen muss.