Unmanaged Structure richtig Marshallen - Woher bekommt man die richtigen Infos...

17/06/2008 - 22:51 von Hans Peter | Report spam
Hi,

ich bin auf folgende Struct bei der MSDN gestoßen:


typedef struct _STRRET {
UINT uType;
union {
LPWSTR pOleStr;
UINT uOffset;
char cStr[MAX_PATH];
} DUMMYUNIONNAME;
} STRRET, *LPSTRRET;


Wenn ich diese Structure jetzt nach VB.NET übernehmen möchte wird daraus:


<StructLayout(LayoutKind.Explicit, Size&4)> _
Public Structure STRRET
<FieldOffset(0)> Public uType As UInt32
<FieldOffset(4)> Public pOleStr As IntPtr
<FieldOffset(4)> Public pStr As IntPtr
<FieldOffset(4)> Public uOffset As UInt32
<FieldOffset(4)> Public cString As IntPtr
End Structure


Ich habe diese Deklaration jetzt von PInvoke.NET. Ich hàtte die
Konvertierung auch gerne selber gemacht, aber ich verstehe nicht woher
ich wissen soll, das ich genau diese Offsets bzw. die Größe eintragen muss?

Ich möchte mir nicht immer solche Dinge von PInvoke.NET übernehmen
sondern es selber schnallen, warum man es so macht.

Kann mir das eine mal ein wenig erklàren?

Danke

Gruß Hans
 

Lesen sie die antworten

#1 Thomas Scheidegger
18/06/2008 - 00:02 | Warnen spam
Hallo Hans

Ich habe diese Deklaration jetzt von PInvoke.NET



so ganz korrekt scheint mir diese nicht,
ggf je nach Einsatz jener Union.
(manchmal wàre es da anstelle der Union evtl. besser,
je nach Fall (hier 'uType') eine spezifischere Struktur/Methode
anzuwenden)


es selber schnallen, warum man es so macht.



für den Background sind aber eigentlich exzellente Kenntnisse von
C++, Win32, (D)COM, zT Compilerbau und Systemarchitektur
nötig, sowie MSDN Studium .NET marshalling
<URL:http://msdn.microsoft.com/en-us/lib...3.aspx>

Ich finde dieses Wissen ist hier nahezu zwingend & lückenlos nötig,
andernfalls làsst man es IMHO besser ganz sein.
.NET-Interop ist halt genau der Schnittpunkt, wo viele verschiedene &
komplexe
Technologien/Generationen frontal aufeinandertreffen.
Und von einigen wenigen Schulbuch-PInvoke-Beispielen làsst sich selten
auf zB all die verrückten Strukturen in Win32 schliessen.

Wichtig:
drauflos-'probieren' (trial&error) gilt hier _keinesfalls_,
eine Interop-Signatur muss einfach schon 'by design' stimmen.
Auch wenn es im Compiler & Debugger ggf mal OK scheint
ist dies noch lange kein Beweis für korrektes Marshalling.
Denn man riskiert hier (Interop!) àusserst fatale Fehler,
welche àhnliche Gefahren wie in classic C/C++/Assembler haben.
(memory leaks, stack/heap corruption, invalid pointers uva)
Öfters tritt der Fehler dann irgendwann/irgendwo (zB beim Kunden!) zufàllig
auf und reisst meist die ganze .NET-Runtime mit in den Tod,
ohne nachvollziehbare Fehlermeldung/Exception.




Thomas Scheidegger - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen