Speicher über DLL reservieren und später auslesen

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Kernle 32DLL

Betreff: Speicher über DLL reservieren und später auslesen

BeitragDi, Jan 08, 2008 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, der Threadtitel ist vielleicht etwas missglücklich gewählt... im grunde geht es um folgendes...

Ich habe in meiner (c++) DLL eine Funktion, die 5 Int-Variablen im Speicher reserviert...
Die Frage ist nun, was passiert wenn ich diese Funktion über B3D aufrufe ?
Türlich, der Speicher wird reserviert, aber was passiert nachdem die Funktion "abgearbeitet" ist ? Bleiben die Int-Werte im Speicher reserviert, oder werden sie freigegeben ?

Die Idee ist, das ich über meine DLL Speicher reserviere, und ihn später wieder per B3D auslesen. Das Auslesen an sich ist nicht das große Problem wenn ich die DLL die Position des ersten der 5 Int-Werte im Speicher zurückliefern lasse (Ergo lassen sich die Positionen der anderen Werte errechnen). Das klappt aber nur wie gedacht, wenn der Speicherbereich nicht zwichenzeitlich als "frei" markiert wird. Denn dann könnte der Bereich einfach überschrieben werden :/

Ich weis, hat nicht sooo viel mit B3D zu tun, aber ich will die Dll ja halt über B3D aufrufen ^_^

Grüßle:
Kernle

PS: Wenn ich die DLL nicht als DLL, sondern als "echtes" Programm ablaufen lasse, wird der Speicher nach beenden des programms anscheinend automatisch als "frei" markiert.
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009
 

Dreamora

BeitragDi, Jan 08, 2008 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du dir schon bewusst bist das es kein BlitzCode Problem ist, warum dann doch in den Coding Boards posten? Wink


Bei ner DLL ist das ganze ein wenig komplizierter. Aber da jede DLL 5 fixe funktionen haben muss die von windows genutzt werden kannst du eigentlich da nen speicherblock allozieren und den erst wieder freigeben wenn die DLL wieder gelöst wird ... alloc wird da helfen Smile


Alternativ kannst du auch, wenn du nicht genau weisst wie oberes ginge, eine Init und Clean funktion machen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Kernle 32DLL

BeitragDi, Jan 08, 2008 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, mir fällt gerade was auf.... so wie ich das momentan mache müsste der Speicherbereich doch eh ziemlich schnell überschrieben werden... immerhin gelten die deklarierten Variablen ja nur Lokal für die deklarierte Funktion Confused. Naja, das wird schon noch Wink

alloc sagt mir leider nicht soviel Wink muss ich wohl nochmal in meinem Büchlein nachschlagen oder Google anschmeißen ^^

Wenn ich eine Init Funktion mache, in wiefern hilft mir das weiter ? Ich meine, genau das habe ich ja im moment Wink

Ein Beispiel meines momentanten Gedankengangs bezüglich des Speichers:

Code: [AUSKLAPPEN]
FunktionBlaBla()   ;Während die (DLL) Funktions ausgeführt wird, weis ich das der Speicher "gesichert" ist...
               ;... Aber was passiert hier, wenn die Funktion "abgeschlossen" ist ? Wie ist dann der Status des
               ;angepeilten Speicherbereichs ?


Grüßle:
Kernle

PS: Sorry Dreamora Wink War mir nte ganz sicher Razz

Edit: Mir ist da grad was aufgefallen ^^ Wie lese ich eigentlich ne Speicherstelle aus lol ? Einen Pointer auf die entsprechende Speicherstelle zu erstellen scheint nicht so richtig funzen zu wollen... shit happens ^^
  • Zuletzt bearbeitet von Kernle 32DLL am Di, Jan 08, 2008 19:57, insgesamt einmal bearbeitet
 

ChristianK

BeitragDi, Jan 08, 2008 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht, ob ich ganz verstanden hab, was du meinst, aber ich kann's ja mal versuchen. Smile

Es gibt ja 2 Möglichkeiten, Speicher zu reservieren. Wenn du einfach "int MeineZahl;" schreibst, werden 4 Byte auf dem Stack reserviert, und beim Verlassen der Funktion freigegeben. Die zweite Möglichkeit ist das Reservieren auf dem Heap: "int* pMeineZahl = new int;" Der Speicher bleibt auch reserviert, wenn die Funktion verlassen wird, allerdings geht der Zeiger auf den Speicher verloren -> Sehr schlecht.

Du kannst das Problem also über zwei Wege lösen:
1. Du nutzt globale Variablen. Die bleiben so lange im Speicher, bis das Blitz-Programm ( und die DLL ) beendet werden.
2. Du nutzt statische Variablen. Die sind lokal, haben aber einen festen Speicherbereich.

Code: [AUSKLAPPEN]
int MeineFunktion( )
{
   static int MeineZahl;
   MeineZahl = MeineZahl + 1;
   
   return 1;
}

Hier wird bei jedem Aufruf der Funktion "Meine Zahl" um eins erhöht, denn sie wird nicht aus dem Speicher entfernt.

Zitat:
sondern als "echtes" Programm

Genau genommen ist eine DLL auch ein echtes Programm mit Code- und Datenbereich. Der einzige Unterschied ist, dass DLLs eben nur durch andere Programme "gestartet" werden können. Sie besitzen auch einen Einstiegspunkt wie "main" in EXE-Dateien.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Kernle 32DLL

BeitragFr, Jan 18, 2008 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für die Hilfe ^^

Globale Variablen gehen bei mir nicht, da ich die Variablen dynamisch per Funktion erzeugen muss (bzw. genauer: die Klasse).

Von diesen "statischen" Variablen hab ich noch nie gehört... aber ich glaube die sind auch nicht so das wahre, da sie lokal sind (bleibt der Speicher trotsdem bis zum ende des Programms reserviert ?)

Jedenfalls sind mir noch 2 Probleme aufgefallen, die (indirekt) mit meinem Problem zu tun haben.

Das erste Problem ist das folgende: ich habe nur die Speicheradresse einer Variable, und kenne auch dessen Typ (z.b. Int). Wie erstelle ich einen Pointer auf genau diese Speicheradresse ? Ich habe da schon verschiedenes probiert, aber nur Compiler-Fehler geerntet :/

Mein zweites Problem ist, das ich es einfach nicht gemanaged kriege Semi-Dynamischen Speicher zu deklarieren (z.b. sowas wie Types oder Banks in B3D). Die Sache ist, das ich die deklarierten Variablen in keine Liste o.ä. zusammenfassen kann, da sie verschiedene Speicheradressen haben (man muss davon ausgehen das zwischen den eigentlichen Variablen die ich "listen" will, auch andere stehen, z.b. 2 Int Variablen und eine Long Variable). Bei B3D-Banks schien es so gemanaged zu sein, das der deklarierte Datenbereich immer hintereinander folgte (außerdem gab es da ja auchnoch ResizeBank...)

Grüßle:
Kernle
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group