2009-08-28 48 views
3

正确引用在C#中的结构我有一个结构字符串不与布局

[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大容量存储设备”

什么是错误的代码?

+0

USB_HWID是什么样的? – 2009-08-28 08:04:00

+0

我不认为这里有什么错,字符串不能从头开始被截断,如果你认为你错过了一些文本,它必须从最后,请检查设备/帮助正确。 – 2009-08-28 08:06:46

+0

我检查了文档通过实际上是坦率地说,我在vC++中编码相同的东西,它工作正常,但不是在c#中。 – 2009-08-28 09:18:50

回答

1

其实我做一个小小的失误这里ULONG是在C#中,其中,因为它是在C++中的4个字节8个字节(大家都知道)。将ulong转换为uint解决了这个问题。

0

试着用的ByValTStr代替ByValArray

+0

以及我更改为ByValTStr,但没有影响 – 2009-08-28 09:21:25

+0

好的......你能发布EnumDevices函数的C签名吗? – 2009-08-28 09:26:02

+0

BOOL EnumDevices( PFT_SERVER_USB_DEVICE lpUsbDevices, PULONG pulBufferSize, PFT_ERROR_STATE lpES ); – 2009-08-28 09:40:06

0

是否已确认在该结构中的字段位于前usbDeviceDescrstatusbExcludeDevicebSharedManuallyulDeviceIdulClientAddr)得到他们正确的价值观?难道它是编组的USB_HWID结构是错误的,所以偏移量在结构的其余部分是4字节?

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);