Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kann dynamische Variable nicht an DLL weitergeben


Gewuerzgurke - Fr 22.01.10 19:11
Titel: Kann dynamische Variable nicht an DLL weitergeben
Hallo, ich hab' wieder Probleme mit der Speicherverwaltung...

Also ich möchte aus meinem Programm verschiedene Werte an eine DLL weitergeben. Dazu reserviere ich mit GetMem ein wenig Speicher und gebe den Pointer und die Größe an die DLL weiter. Diese kann dann ganz prima den Speicher auslesen aber dann kann ich den Speicher weder in der DLL noch im Programm wieder freigeben - es kommt dann immer ein Fehler mit "Ungültige Zeigeroperation".

Wenn ich gleich nach GetMem wieder FreeMem mache, geht's, nur die DLL kann dann - logischer Weise - nicht auf den Speicher zugreifen. Aber sobald ich den Pointer, den GetMem liefert, an die DLL gebe, geht's nicht mehr :gruebel:
Klingt unlogisch, aber kann es sein, dass ShareMem den Pointer erkennt und den Speicher freigibt?

Jetzt ist deswegen mein Delphi schon zweimal übelst abgestürtzt - also irgendwas mache ich verkehrt...


Xentar - Fr 22.01.10 19:17

user profile iconGewuerzgurke hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt ist deswegen mein Delphi schon zweimal übelst abgestürtzt - also irgendwas mache ich verkehrt...

Du könntest uns erstmal zeigen, was du überhaupt machst, bzw. wie du es machst.


Gewuerzgurke - Fr 22.01.10 20:22

Oh, ich habe meinen Fehler soeben gefunden:

Ich wollte mit der DLL eine Zeichenkette aus dem Programm lesen und das Programm sollte einen TMemInfo (= packed Record aus Pointer auf eine dynamische Variable und Größe der Variable) zurückgeben. In dieser dynamischen Variable sollte dann ein PChar auf die Zeichenkette stehen. (Ja, es ist dämlich, ein 8-Byte-Record als Pointer auf eine 4-Byte-Variable zurückzugeben, aber das gehört zum Konzept und macht anderswo wieder Sinn...)

Ich habe in meinem Programm den Speicher reserviert:

Delphi-Quelltext
1:
2:
3:
   Result.Size := 4;
   GetMem(Result.P,Result.Size);
   PPointer(   @    Result.P)^ := @RPath[1];

Dann, um in den Speicher einen PChar zu schreiben das mit dem PPointer (Ja, es ist verwirrend) und da hab' ich versehentlich dieses hier jetzt freistehende @ eingefügt, wodurch dann Result.P nicht mehr auf den Speicher, sondern irgendwo hin gezeigt hat. Das Freigeben dieses vermeintlichen Speichers hat dann zum Absturz von Delphi geführt, aber vorher hat die DLL noch korrekt die Zeichenkette, auf die der PChar gezeigt hat, ausgegeben, weil ich auch da geschrieben habe:

Delphi-Quelltext
1:
ShowMessage(PChar(MemInf.P));                    

Korrekt währe

Delphi-Quelltext
1:
ShowMessage(PChar(Pointer(MemInf.P)^));                    
.

Naja, war dann doch mein Fehler und kein Problem mit ShareMem... :flehan:

Ihr könnt dieses Thema dann von mir aus löschen...
@Xentar : Ja, ich hätte den Code vielleicht doch gleich posten sollen *sorry* - hab' den Fehler eben gerade noch entdeckt, bevor ich den Quelltext abschicken wollte :D