2010-09-01 55 views
1

AccessViolationException我收到一個AccessViolationExcpetion通過調用Marshal.PtrToStructure(intPtr,typeof(Servent))。 任何想法我做錯了什麼?我在x64上試過這個。當調用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

這將是有益的,如果你能提供的'Servent'結構的本機定義;也就是說,如果你有權訪問它。 – kbrimington 2010-09-01 13:12:22

回答

0

你可能需要指定字符串字段的佈局方式,否則編組將無法確定該類型的正確尺寸。

+0

你能舉個例子嗎?我在WinAPI調用方面並不是很有經驗。 – 2010-09-01 12:58:18

2

的問題是,Servent結構是在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

的確如此,但它並不能解釋事故。 – 2010-09-01 13:35:18

+0

@Hans Passant:當然可以!由於包裝,尺寸不同。 – leppie 2010-09-01 13:39:07

+0

謝謝,這確實是問題所在! – 2010-09-06 09:10:03