2009-06-03 3 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); 
    } 

} 

Я получаю исключение FatalExecutionEngine в объявлении deref2. Я не могу понять, как вернуть связанный список и получить доступ к его содержимому.

Вот код 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

Я ответил на ваш другой вопрос вдоль этих линий. Определение Shay's 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

+0

Это действительно хороший ответ! – 3vts

Смежные вопросы