3 Stimmen

AccessViolationException beim Aufrufen von Marshal.PtrToStructure

Ich erhalte eine AccessViolationExcpetion, wenn ich Marshal.PtrToStructure(intPtr, typeof(Servent)) aufrufe. Irgendwelche Ideen, was ich falsch gemacht habe? Ich habe es auf x64 versucht.

    IntPtr intPtr = NativeMethods.GetServByName(name, "tcp");
     if (intPtr != IntPtr.Zero)
     {
        Servent servent = (Servent)Marshal.PtrToStructure(intPtr, typeof(Servent));
        result = System.Convert.ToInt32(IPAddress.NetworkToHostOrder(servent.s_port));
     }
     else
     {
        throw CreateWSAException();
     }

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  internal struct Servent
  {
     public string s_name;
     public IntPtr s_aliases;
    public short s_port;
     public string s_proto;
  }

0 Stimmen

Es wäre hilfreich, wenn Sie die native Definition der Servent-Struktur zur Verfügung stellen könnten; das heißt, wenn Sie darauf Zugriff haben.

4voto

Problembär Punkte 171

Das Problem war, dass die Servent-Struktur auf x64 unterschiedlich ist:

struct  servent {
        char    FAR * s_name;           /* offizieller Dienstname */
        char    FAR * FAR * s_aliases;  /* Aliasliste */
#ifdef _WIN64
        char    FAR * s_proto;          /* zu verwendendes Protokoll */
        short   s_port;                 /* Port # */
#else
        short   s_port;                 /* Port # */
        char    FAR * s_proto;          /* zu verwendendes Protokoll */
#endif
};

0 Stimmen

Wahr, aber das erklärt den Absturz nicht.

0 Stimmen

@Hans Passant: Natürlich! Die Größe ist aufgrund des Packens unterschiedlich.

0 Stimmen

Danke, das war tatsächlich das Problem!

0voto

leppie Punkte 111830

Sie müssen wahrscheinlich angeben, wie die Zeichenfolgenfelder angeordnet sind, da andernfalls die Umwandlung fehlschlägt, um die richtige Größe für den Typ zu bestimmen.

0 Stimmen

Könntest du ein Beispiel geben? Ich habe nicht wirklich Erfahrung mit WinAPI-Aufrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X