我有一个结构
[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”
代码有什么问题?
答案 0 :(得分:1)
实际上我犯了一个小错误,这里ulong是c#中的8个字节,因为它在c ++中是4个字节(众所周知)。将ulong转换为uint解决了这个问题。
答案 1 :(得分:0)
尝试使用ByValTStr
代替ByValArray
答案 2 :(得分:0)
您是否确认结构中的字段位于usbDeviceDescr
之前(status
,bExcludeDevice
,bSharedManually
,ulDeviceId
和{{1}之前获取正确的值?可能是ulClientAddr
结构的编组是错误的,所以结构的其余部分的偏移量减少了4个字节?
答案 3 :(得分: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);