2010-09-01 15 views
1

Je reçois un AccessViolationExcpetion en appelant Marshal.PtrToStructure (intPtr, typeof (Servent)). Des idées de ce que j'ai mal fait? J'ai essayé ceci sur x64.AccessViolationException lors de l'appel de Marshal.PtrToStructure

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

Il serait utile que vous pouvez fournir la définition native de la structure 'Servent'; c'est-à-dire si vous y avez accès. – kbrimington

Répondre

0

Vous devez probablement spécifier comment les champs de chaîne sont disposés, sinon le classement ne pourra pas déterminer la taille correcte pour le type.

+0

Pourriez-vous donner un exemple? Je ne suis pas vraiment expérimenté dans les appels WinAPI. –

2

Le problème était que la struct Servent est différent sur x64:

struct servent { 
     char FAR * s_name;   /* official service name */ 
     char FAR * FAR * s_aliases; /* alias list */ 
#ifdef _WIN64 
     char FAR * s_proto;   /* protocol to use */ 
     short s_port;     /* port # */ 
#else 
     short s_port;     /* port # */ 
     char FAR * s_proto;   /* protocol to use */ 
#endif 
}; 
+0

C'est vrai, mais cela n'explique pas le crash. –

+0

@Hans Passant: Bien sûr que oui! La taille est différente en raison de l'emballage. – leppie

+0

Merci, c'était en effet le problème! –