gemeinsamer speicher
-
Hi,
ich möchte zwischen einer dll und einer Anwendung daten austauschen, indem ich von der dll aus der anwendung eine message (PosstMessage) mit dem Pointer auf das datum sende.Nur kann ich aus der Anwendung auf den speicher nicht zugreifen (Zugriffsverletzung).
Hat jemand eine Idee?
-
Hat jemand eine Idee?
Eine Idee zu was? Erklärung warum dein Vorhaben mit obigem Ansatz nicht funktioniert? Lösungsmöglichkeiten?
Simon
-
Ich dachte eigendlich, ich hätte mich verständlich gemacht

Ich versuchs mal mit einer detailierteren Beschreibung:
Ich habe eine DLL, die einen WH_MOUSEHOOK installiert und die Hookrozedur enthält.
Die DLL enthält ein Datensegment, dass sich alle Instanzen teilen und eins, was für jede Instanz separat ist.
Die DLL soll eigendich nicht viel mehr machen, als die gehhookten Nachrichten an die startende Applikation zu posten.
Das eine Argument der Hookpreozedur enthält einen Pointer auf die Nutzdaten.Wenn ich den Pointer einfach an die steuernde Anwendung sende, steht da nur Müll drin.
Ich vermute, der Pointer zeigt auf einen Bereich, den jede Instanz privat hat.
Die Hookprezedur wird im Kontext der gehookten Anwendung ausgeführt.
Da ich den Pointer aber im Kontext der Kontrollanwendung auslese, steht da nur Müll drin.Ich habe versucht die Daten in den shared Bereich der DLL zu kopieren und einen Pointer darauf weiterzugeben.
Wenn ich diesen in der Kontrollanwendung dereferenziere bekomme ich eine Accessviolation.Was ich suche ist irgend ein Mechanismus, mit dem ich Speicher so bereitstellen kann, dass ihn die Kontrollanwendung auslesen und die DLL im Kontext der gehookten Anwendung beschreiben kann.
-
1. Shared Bereiche in eine DLL können nur dann funktionieren, wenn beide Prozesse die gleiche DLL geladen haben.
2. Man kann prozessübergreifend nicht einfach Zeiger versenden, wenn diese nicht wirklich in einem gemeinasmen Speicher Segment leigen. Verwende z.B. eine Memory Mapped file.
3. Wnen Du PostMessage verwendest hast Du
a. Keine Garantie, dass die Nachricht ankommt
b. Weißt Du nicht wie lange Du im sendenden Programm den Speicher bereithalten musst und wan Du ihn wieder freigeben kanst.Verwende eine andere Art von IPC, z.B. Named Pipes. Oder packe die Informationen zusammen, dass Sie wirklich in 64bits passen
(WPARAM+LPARAM Größe. Oder nutze einen Queue Mechnismus über eine memory Mapped File mit Events und Semaphoren.
-
1. Shared Bereiche in eine DLL können nur dann funktionieren, wenn beide Prozesse die gleiche DLL geladen haben.
Die Kontrollanwendung läd die dll sowiso.
Die gehookte anwendung läd die dll ebenfalls automatisch.
Ich kann dennoch von der Kontrollanwendung nicht auf Speicher des shared Segments zugreifen, da Access Violation.2. Man kann prozessübergreifend nicht einfach Zeiger versenden, wenn diese nicht wirklich in einem gemeinasmen Speicher Segment leigen. Verwende z.B. eine Memory Mapped file.
Memory Mapped file passen da nicht richtig, die muss man doch mit read und write wie Dateien Beschreiben, oder? Gibt es denn keine Möglichkeit einen Speicherbereich für ein anderes Programm freizugeben?
3. Wnen Du PostMessage verwendest hast Du
a. Keine Garantie, dass die Nachricht ankommtMacht nix wenn hin und wieder welche verloren gehen.
Aber das ganze funktioniert schon, bis auf die Daten.b. Weißt Du nicht wie lange Du im sendenden Programm den Speicher bereithalten musst und wan Du ihn wieder freigeben kanst.
Ich benutze einen circulären Puffer. Würde nur im installHook speicher anfordern und im UninstallHook wieder freigeben.
Oder packe die Informationen zusammen, dass Sie wirklich in 64bits passen
Is wahrscheinlich das unkomplizierteste.
-
Bei Memory Mapped Files benötigst Du keine Read/Writes. Du schreibst einfach mit Zuweisungsoperationen in den gemappten Speicher und das wars.
-
dann werd ich das mal versuchen, danke