Frage

Ich habe noch eine gute Referenz zu diesem Thema zu finden. Für dieses Beispiel werden wir einige C ++ Code, den ich in den Hafen versuchen zu über C #.

In C ++ Land haben wir die folgenden Prototyp für eine externe Library-Funktion:

extern "C" DWORD EXPORT FILES_GetMemoryMapping(
  PSTR pPathFile,
  PWORD Size,
  PSTR MapName,
  PWORD PacketSize,
  PMAPPING pMapping,
  PBYTE PagesPerSector);

und es ist wie so verwendet:

FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);

Jetzt versuche ich, in den Hafen die erste Zeile über zu C # und hier ist, wo ich ohne klaren Weg präsentiert bin.

Dies ist, was ich bisher habe:

[DllImport("Files.DLL")]
public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)]
    string pPathFile,
    out ushort Size,
    [MarshalAs(UnmanagedType.LPStr)]
    string MapName,
    out ushort PacketSize,
    IntPtr pMapping,
    out byte PagesPerSector);

Nun ist die Frage: Gibt es eine gute Führung gibt, die mir ein „PSTR pPathFile“ sollte „[MarshalAs (UnmanagedType.LPStr)] string pPathFile“ sagt ... dass Unter der Annahme korrekt ist

Oder eine, die ein Zeiger auf ein "PMAPPING" struct ein "out IntPtr pMapping" wird ... vorausgesetzt, dass richtig ist?

Jede Hilfe auf diesen Typen?

War es hilfreich?

Lösung

  

Ich habe noch eine gute Referenz zu diesem Thema finden

Hier gehen Sie.

Merkwürdig ist, ist die Seite nach unten im Moment, aber es ist eine sehr gute Quelle für Rangier- Probleme. In der Zwischenzeit können Sie Archive.net das Archiv von pinvoke.net unter http://web.archive.org/web/20080202041852/http://www.pinvoke.net

Andere Tipps

Das sieht richtig. Der erste Teil Ihrer Frage (in Bezug auf MarshalAs) teilt den Compiler den verwaltete C # Variable in eine PSTR zu konvertieren. in der .NET-Umgebung bezieht sich Marshalling von Daten zwischen der verwalteten und nicht verwalteten Umgebung zu übertragen. Diese Attribute (unter mehreren anderen) sagen dem Compiler, wie es speziell zu tun.

Der zweite Punkt zeigt an, dass es einen Zeiger auf die Struktur passieren los ist. Der IntPtr-Typ in .NET ist ein verwaltete Typ, der auf einen bestimmten Teil des Speichers zu halten, verwendet wird. In der .NET-Welt, Zeiger (in der Regel) nicht existieren, wenn auch noch Referenztypen es gibt. Pointer und Griff-Management ist für uns von der CLR getan. Die IntPtr-Struktur verwendet wird, wenn Zeiger auf Datenstrukturen oder primitive Typen

Marshalling

Neben dem P / Invoke Website, Adam Nathan 's NET und COM. Die komplette Interoperability Guide ist etwas, lohnt sich das Hinzufügen zu Ihrem Bücherregal, wenn Sie mehr als ein vorübergehendes Interesse an .NET-Interop haben

Kev

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top