تنظيم قائمة مرتبطة
-
09-09-2019 - |
سؤال
الاعتذار عن النشر المكرر.
أهلا
أواجه مشكلة في حشد قائمة مرتبطة من 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);
}
}
أحصل على استثناء FatoLexcentengine في إعلان 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);
}
المحلول
جرب هذا:
[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;
};
نصائح أخرى
أجبت على سؤالك الآخر على طول هذه الخطوط. شاي 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;
}
}
يجب أن تغلق السؤال الآخر حقا - لاحظت فقط الحظ الذي نشرته هذا واحد أيضا.
لا تنتمي إلى StackOverflow