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.