سؤال

الاعتذار عن النشر المكرر.

أهلا

أواجه مشكلة في حشد قائمة مرتبطة من 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;
    }
}

يجب أن تغلق السؤال الآخر حقا - لاحظت فقط الحظ الذي نشرته هذا واحد أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top