Ich versuche, eine Prozedur in einer Delphi-DLL von C# aufzurufen. Die Prozedur erwartet, dass der Aufrufer eine array of array of TSomeRecord
vorerfasst und eingibt, von der er dann die TSomeRecord
Elemente manipuliert, um Ergebnisse zurückzugeben. Also, ich muss Delphi dynamische Felder Arrays von X in Handarbeit machen.
Jetzt, I have found here, dass eine dynamische array of X
besteht aus einem Zeiger auf das erste Element des dynamischen Arrays, und dass dieses erste Element eine Referenzzahl und die Länge hat (Anzahl der Elemente) des Feldes vorangestellt (jeweils 32-Bit-Ganzzahlen), und dass die Elemente inline und zusammenhängend gespeichert werden, so dass das ganze so aussieht Speicher:Wie ist das Speicherlayout eines dynamischen Delphi-Arrays des dynamischen Arrays von X?
rrrrllll000...000111...12... ^
mit rrrr der Referenzzählwert , llll die Länge,die Elemente und^wohin der Zeiger zeigt. Dies bestätigt; Ich habe es getestet und es funktioniert.
für mehrdimensionale dynamische Arrays I angenommen, dass ich array of Y
für die X
in array of X
, mit anderen Worten, dass die äußere Dimension Arrays ein dynamisches Array von (Zeiger) ist einfach ersetzen kann dynamisch, etwa so:
rrrrllll000011112222... ^
wobei die Elemente 0000, 1111 usw. nun 32-Bit-Zeiger für unabhängig zugeordnete dynamische Arrays sind. Wenn ich so vorgehe, erhalte ich eine Zugriffsverletzung für meine Probleme. Das ist offensichtlich nicht, wie Delphi es von mir erwartet. Kann mir jemand erklären wie ich das am soll?
Danke für Ihre Antwort. Ich weiß, dass dies mit (Beispiel) Code leichter zu diagnostizieren ist, aber ich habe keinen; nur die Signatur des Verfahrens. Die DLL ist eine Blackbox von Drittanbietern. –
Dann ist der einzige Rat, den ich Ihnen geben kann, an dem Prinzip zu bleiben, dass derjenige, der auch zuweist, die Zuordnung aufheben muss oder die DLL in Delphi in ein Delphi umbrechen muss.exe (comserver) oder dll zuerst, die die automatisierten Typen von der Schnittstelle entfernt –