2009-06-03 39 views
1

抱歉重复发布。编组链接列表

我无法编组从DLL链接列表。

------ C++结构和功能--------

struct localeInfo { 
    WCHAR countryName[BUFFER_SIZE]; 
    WCHAR localeName[BUFFER_SIZE]; 
    localeInfo *next; 
} 

int GetSystemLocales(localeInfo **ppList); 

----------- C#声明-------- ---

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
private struct LocaleInfo { 
    public string countryName; 
    public string localeName; 
    public IntPtr next; 
}; 

[DllImport("systemLocales.dll")] 
private static extern int GetSystemLocales(ref IntPtr ppList); 


int main() 
{ 
    var pListHead = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr))); 
    try 
    { 
     GetSystemLocales(ref pListHead); 
     var deref1(IntPtr)Marshal.PtrToStructure(pListHead, typeof(IntPtr)); 
     var deref2 = (LocaleInfo)Marshal.PtrToStructure(deref1, typeof(LocaleInfo)); 
    } 
    finally 
    { 
     Marshal.FreeHGlobal(pListHead); 
    } 

} 

我在deref2声明中得到了FatalExecutionEngine异常。我无法弄清楚如何获取链接列表并访问其内容。

这是我编写的用于获取链表的C++代码。我想要类似于C#中的工作。

localeInfo *pHead = NULL; 
localeInfo *pTemp; 
GetSystemLocales(&pHead); 

for(pTemp = pHead; pTemp!=NULL; pTemp = pTemp->next) 
{ 
     wprintf(L"Display Name : %s (%s) \n", pTemp->countryName, pTemp->localeName); 
} 

回答

1

试试这个:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
private struct LocaleInfo { 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BUFFER_SIZE)] 
    public string countryName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BUFFER_SIZE)] 
    public string localeName; 
    public IntPtr next; 
}; 
1

我回答就沿着这些线路您的其他问题。谢伊的struct的定义是它的一部分,但我也更正了Main

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
private struct LocaleInfo 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BUFFER_SIZE)] 
    public string countryName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BUFFER_SIZE)] 
    public string localeName; 
    public IntPtr next; 
}; 

[DllImport("systemLocales.dll")] 
private static extern int GetSystemLocales(ref IntPtr ppList); 

static void Main() 
{ 
    IntPtr pList = IntPtr.Zero; 
    GetSystemLocales(ref pList); 
    while (pList != IntPtr.Zero) 
    { 
     var info = (LocaleInfo)Marshal.PtrToStructure(pList, typeof(LocaleInfo)); 
     Console.WriteLine("Display Name : {0} ({1}) ", info.countryName, info.localeName); 
     Marshal.FreeHGlobal(pList); 
     pList = info.next; 
    } 
} 

你应该真正关闭其他的问题 - 我只是你已张贴这一个太幸运注意到。

+0

感谢您的回复。有效!没有选择关闭/删除本网站上的问题......至少我找不到它。 – Ashish 2009-06-11 22:53:18