使用布局在C#结构中未正确引用字符串

时间:2009-08-28 07:53:15

标签: c# structure

我有一个结构

[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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试使用ByValTStr代替ByValArray

答案 2 :(得分:0)

您是否确认结构中的字段位于usbDeviceDescr之前(statusbExcludeDevicebSharedManuallyulDeviceId和{{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);