2009-06-03 40 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