Hallo, liebe Community,
manchmal wünsche ich mir die guten, alten Pointer zurück!
Ich habe ein Problem, mit dem ich noch keine Erfahjrung habe, da ich bislang entweder im unmanaged code herumgewerkelt habe, ODER im managed. Jetzt habe ich aber ein Problem, das beides betrifft.
Ich benötige Informationen aus unmanaged code in Form einer Liste von GUIDs. Um die zu ermitteln, gibt es eine Schnittstellenfunktion, die wie folgt deklariert ist:
C#-Quelltext
1: 2: 3: 4:
| HRESULT GetIds( [out] GUID **ppId, [in, out] UINT *pCount ); |
Die versuche ich, mit Delphi anzusprechen. Daher habe ich einen Delegaten deklariert nach
Delphi-Quelltext
1:
| funktion GetIDs(out pKD: KommtGleich; out Count: Integer): HResult |
Das Natürliche wäre nun, eine Variable
Delphi-Quelltext
1: 2: 3: 4:
| type TGUIDArray = Array of TGUID; var GUIDArray: TGUIDArray |
zu deklarieren und der Funktion zu übergeben. Tut man das, erhält man die Exception "Es wurde ein SafeArray vom Rang 14852 an eine Methode übergeben, die ein Array vom Rang 1 erwartet hat." OK! Das ist dar Problem der Datenübertragung zwischen unmanaged und managed code, wie ich vermute. Also: marshallen. Aber: wie? Meine diversen Versuche haben nichts gebracht.
Also zweiter Versuch:
Delphi-Quelltext
1:
| function GetIDs(out pKD: IntPtr; out Count: Integer): HResult; |
Und der Vesuch, analog zur damaligen Zuweisung eines PGUIDArray an eine Variable das Problem zu lösen. Aber auch hier führten meine Versuche des Marshallens nicht zum Erfolg. Entweder, der zurückgegebene Pointer erzeugte eine Exception nach dem Motto: "Es wurde versucht, in geschütztem Code zu lesen oder zu schreiben" oder so ähnlich, oder der Versuch, dass array auszulesen, wurde mit der Meldung bestraft, dass der Index den erlaubten Bereich überschreitet - auch beim Index 0 und obwohl mir Count sehr glaubhaft mitteilt, dass es jede Menge Einträge in der Liste gibt.
Kann mir jemand helfen?
Gruß,
ASMFreak
Und aus dem Chaos sprach eine Stimme zu mir: Lächle und sei froh, es könnte schlimmer kommen.