2009-06-03 9 views
1

重複する投稿のお詫び。リンクされたリストをマーシャリングする

こんにちは

DLLからリンクリストをマーシャリングするときに問題があります。

------ C++構造と機能--------

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

int GetSystemLocales(localeInfo **ppList); 

----------- C#の宣言-------- ---

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

。 Shayの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