2009-06-03 2 views
1

중복 게시에 대해 사과드립니다.링크드 마샬링

안녕

나는 데 문제가 DLL에서 연결리스트를 정렬 화를있다.

------ C++ 구조와 기능 --------

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

int GetSystemLocales(localeInfo **ppList); 

----------- C# 1 선언 -------- ---

[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

. 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