Я использую С# с P/Invoke для доступа к методу DLL. Определение метода следующее:
[DllImport("userManager.dll")]
static extern int GetUsers(out IntPtr userList);
Оригинальные структуры:
typedef struct user_list {
unsigned short NumUsers;
USER_LIST_ITEM List[VARLEN];
} USER_LIST
typedef struct user_list_item {
char name[260];
unsigned char address[256];
} USER_LIST_ITEM
И макет структуры, который я сделал, следующий:
[StructLayout(LayoutKind.Sequential)]
public class USER_LIST
{
public uint NumUsers;
[MarshalAs(UnmanagedType.ByValArray)]
public USER_LIST_ITEM [] List;
}
[StructLayout(LayoutKind.Sequential)]
public class USER_LIST_ITEM
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string address;
};
Но я получаю сообщение об ошибке, когда пытаюсь разобрать его:
USER_LIST userList = new USER_LIST();
// Prepare pointer
IntPtr uList = Marshal.AllocHGlobal(Marshal.SizeOf(userList));
Marshal.StructureToPtr(userList, uList, false);
result = GetUsers(out uList);
Marshal.PtrToStructure(uList, userList); <--
Среда выполнения обнаружила фатальную ошибку. Адрес ошибки был 0x79f82af6, в потоке 0x464. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в среде CLR или в небезопасных или непроверяемых частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки маршалинга пользователя для COM-interop или PInvoke, которые могут повредить стек.
Я правильно понимаю свойство NumUsers, но кажется, что ошибка возникает при разупорядочении массива. Есть предположения?
out uList
означает, чтоuList
будет перезаписано, но в собственный код не будет передано никакого значения. - person dtb   schedule 07.12.2009OUT USER_LIST**
? Тройной указатель!? - person dtb   schedule 07.12.2009USER_LIST* user_list; res = GetUsers(&user_list);
-- это не выделяет память для элементов пользовательского списка, не так ли? - person dtb   schedule 07.12.2009