Laden...

Pointer und Strukturen

Erstellt von Coder vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.683 Views
C
Coder Themenstarter:in
11 Beiträge seit 2005
vor 18 Jahren
Pointer und Strukturen

Hi,

kurze Frage.

Ist es in C# möglich eine Struktur in einen IntPtr zu Casten?
In C ist es ja ohne weiteres Möglich so einen Cast vorzunehmen. Mein Problem ist as ich eine externe w32 Funktion aufrufen will, die bei unterschiedlichen Befehlen jeweils eine andere Struktur erwartet/nutzt.

MFG Thomas

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ja, das ist möglich. Das passiert entweder vollautomtaisch beim Aufruf der Win32-Funktion oder explizit via Marshal.StructureToPtr().

Schau dir mal die Hilfe unter den Stichworten "PInvoke", "Marshalling" und "DllImport" an.

C
Coder Themenstarter:in
11 Beiträge seit 2005
vor 18 Jahren

Danke für die schnelle Antwort!

Marshal.StructureToPtr() war genau das was ich gesucht hab. Funktioniert auch super. 👍

MFG Thomas

S
8.746 Beiträge seit 2005
vor 18 Jahren

Trotzdem der Tipp dir mal die Hilfe anzuschauen. Man benötigt nämlich in den allerseltensten Fällen diese Funktion, weil .NET eine automatische Konvertierung anbietet.

C
Coder Themenstarter:in
11 Beiträge seit 2005
vor 18 Jahren

mhhh... ok

Die Automatische Konvertierung ist denk ich mal, wenn ich eine externe Funktion habe die zb. einen Pointer als Parameter erwartet und ich unter .Net mit DllImport im Prototyp statt des Pointers einfach eine Struktur angebe.

ist das richtig?

S
8.746 Beiträge seit 2005
vor 18 Jahren

Korrekt. Damit das aber so funktioniert muss man in der DLLImport-Definition den Struct-Parameter als [MarshalAs.LPStruct] auszeichnen. Dann weiss .NET, dass es einen Pointer übergeben soll, anstelle die Struktur auf den Stack zu legen (Structs sind ja Value-Typen und werden per Default auf dem Stack übergeben).

Alternativ kannst du anstelle eines Structs einfach eine Klasse verwenden. Dann kannst du auf LPStruct verzichten. Ist aber m.E. nicht so schön, weil man damit auf die Layout-Attribute des Structs verzichten muss.

C
Coder Themenstarter:in
11 Beiträge seit 2005
vor 18 Jahren

Ich hab die Struktur als Referenzparameter übergeben. Somit übergibt er ja auch einen Pointer. Das Funktioniert auch wunderbar.

[MarshalAs.LPStruct] hat ne Exception geworfen zur Laufzeit.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Sorry, die Info war auch falsch. LPStruct bewirkt im Prinzip NIE irgendetwas, außer in Zusammenhang mit GUIDs (dort macht es tatsächlich aus einem call-by-value ein call-by-ref). Wo wir schonmal bei meinen falschen Ausagen sind: Auch Klassen kennen das Layout-Attribut.