Строка не ссылается должным образом в структуре C # с макетом - PullRequest
3 голосов
/ 28 августа 2009

У меня есть структура

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SERVER_USB_DEVICE
{
    USB_HWID usbHWID;
    byte status;
    bool bExcludeDevice;
    bool bSharedManually;
    ulong ulDeviceId;
    ulong ulClientAddr;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    string usbDeviceDescr;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    string locationInfo;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    string nickName;
}

Когда я передаю его в функцию Win32 DLL, как показано ниже:

[DllImport ("abc.dll", EntryPoint="EnumDevices", CharSet=CharSet.Ansi)]
public static extern bool EnumDevices(IntPtr lpUsbDevices,
                                      ref  ulong pulBufferSize, 
                                      IntPtr lpES);

Я получил пропущенный текст в строковых элементах структуры.

Предположим, что SERVER_USB_DEVICE.usbDeviceDescr содержит значение «Запоминающее устройство большой емкости», которое неверно и должно содержать значение «Запоминающее устройство большой емкости USB»

Что не так в коде?

Ответы [ 4 ]

1 голос
/ 01 сентября 2009

На самом деле я допустил небольшую ошибку: ulong - это 8 байтов в c #, где это 4 байта в c ++ (как мы все знаем). преобразование ulong в uint решило проблему.

0 голосов
/ 28 августа 2009

Проверено ли, что поля в структуре, расположенные до usbDeviceDescr (status, bExcludeDevice, bSharedManually, ulDeviceId и ulClientAddr), получают правильные значения? Может ли быть так, что неправильное распределение структуры USB_HWID, так что смещения отключены на 4 байта для остальной части структуры?

0 голосов
/ 28 августа 2009

Вы можете посмотреть на структуру в байтовом массиве, чтобы убедиться, что все выровнено правильно. Попробуйте это:

int size = Marshal.SizeOf(typeof(SERVER_USB_DEVICE));
byte[] buffer1 = new byte[size];
SERVER_USB_DEVICE[] buffer2 = new SERVER_USB_DEVICE[1];
// put instance of SERVER_USB_DEVICE into buffer2
Buffer.BlockCopy(buffer2, 0, buffer1, 0, size);
0 голосов
/ 28 августа 2009

Попробуйте с ByValTStr вместо ByValArray

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...