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...
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
