Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriff von DLL auf Speicherbereich (https://www.delphipraxis.net/33850-zugriff-von-dll-auf-speicherbereich.html)

Shaman 13. Nov 2004 17:53


Zugriff von DLL auf Speicherbereich
 
Hallo zusammen

Wie kann ich von einer DLL aus am einfachsten auf einen Speicherbereich lesend zugreifen, welcher in dem Programm liegt, das sie einbindet? Wichtig ist, dass die Daten von der DLL nicht geändert werden können.

Gruss
Shaman

Assarbad 13. Nov 2004 22:46

Re: Zugriff von DLL auf Speicherbereich
 
Da Execute eigentlich Read impliziert, hast du bereits alle Rechte. Du brauchst also nur eine gültige Adresse. Unter Windows bekommst du die Basisadresse der Anwendung mit GetModuleHandle()

toms 14. Nov 2004 07:59

Re: Zugriff von DLL auf Speicherbereich
 
Zitat:

Wie kann ich von einer DLL aus am einfachsten auf einen Speicherbereich lesend zugreifen, welcher in dem Programm liegt, das sie einbindet? Wichtig ist, dass die Daten von der DLL nicht geändert werden können.
Was genau möchtest du denn machen?
Vielleicht kannst du dein Problem auch mit Hier im Forum suchenCreateFileMapping lösen?

Shaman 14. Nov 2004 11:43

Re: Zugriff von DLL auf Speicherbereich
 
Also, ich kam auf die Idee, so à la Pascal Robots ein Snake-Spiel zu machen, wobei die Schlangen nicht direkt gesteuert werden, sondern eine KI besitzen, welche man in einer DLL programmiert. Das Spiel ruft dann Funktionen aus der KI-DLL auf, welche z.B. den nächsten Zug festlegen. Jetzt müssen den DLLs natürlich auch Informationen über das Spielfeld bereitgestellt werden, doch sie dürfen diese nicht verändern können. Wie lässt sich das am besten realisieren?

Gruss
Shaman

Assarbad 14. Nov 2004 13:00

Re: Zugriff von DLL auf Speicherbereich
 
Zitat:

Zitat von Shaman
Also, ich kam auf die Idee, so à la Pascal Robots ein Snake-Spiel zu machen, wobei die Schlangen nicht direkt gesteuert werden, sondern eine KI besitzen, welche man in einer DLL programmiert. Das Spiel ruft dann Funktionen aus der KI-DLL auf, welche z.B. den nächsten Zug festlegen. Jetzt müssen den DLLs natürlich auch Informationen über das Spielfeld bereitgestellt werden, doch sie dürfen diese nicht verändern können. Wie lässt sich das am besten realisieren?

Ehrliche Antwort? Garnicht!

Du kannst zwar zB mit VirtualAlloc(), VirtualFree() und VirtualProtect() einfach mal den Speicherbereich schützen - aber leider ist ja die DLL im Prozeß und hat exakt die gleichen Rechte wie das Prozeßmodul selbst. Also kann sie alles machen - inklusive VirtualProtect() aufrufen um den Schutz zu unterminieren.

Eine andere, wenn auch langsamere, Methode der Übergabe wäre wohl das Kopieren des gesamten Feldes in den von der DLL bereitgestellen Speicherbereich.

Die (IMO) beste Methode jedoch könnte über MMFs (siehe Vorredner) möglich sein, da man deren Zugriff auch limitieren kann. Also angenommen du hast eine MMF (bzw deren Handle) und gibst der DLL nur einen View-Pointer zur MMF, der bereits schreibgeschützt ist (also der View auf die MMF ist schreibgeschützt), dann hast du keine Probleme mehr. Umgehen kann man das sicherlich auch, aber nicht ohne größere Kopfstände.
MMFs sind nicht direkt im Prozeßspeicher in dem Sinne, sondern werden nur in den geteilten Raum aller Benutzerprozesse gemappt. Das erklärt auch den Unterschied.

*Innerhalb* des Prozesses wie du es vorher ansprachst ist es aussichtslos, da die DLL alle Maßnahmen von dir unterminieren kann. Allerdings sollte normalerweise zwischen dem "Pluginschreiber" und dem Programmautor ein Konsens stattfinden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz