3

我有一个结构

[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 包含值“Mass Storage Device”这是错误的,它应该包含值“USB Mass Storage Device”

代码有什么问题?

4

4 回答 4

1

实际上,我在这里犯了一个小错误,ulong 在 c# 中是 8 个字节,而在 c++ 中是 4 个字节(众所周知)。将 ulong 转换为 uint 解决了这个问题。

于 2009-09-01T05:30:55.197 回答
0

尝试使用ByValTStr而不是ByValArray

于 2009-08-28T08:16:11.600 回答
0

您是否验证了结构中位于usbDeviceDescr( statusbExcludeDevicebSharedManuallyulDeviceIdulClientAddr) 之前的字段是否获得了正确的值?可能是USB_HWID结构的编组错误,使得结构其余部分的偏移量减少了 4 个字节?

于 2009-08-28T10:28:48.900 回答
0

您可以查看字节数组中的结构,以确保所有内容都正确对齐。试试这个:

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);
于 2009-08-28T15:33:26.943 回答