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
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.
Danke für die schnelle Antwort!
Marshal.StructureToPtr() war genau das was ich gesucht hab. Funktioniert auch super. 👍
MFG Thomas
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.
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?
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.
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.
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.