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

usbDeviceDescr( statusbExcludeDevicebSharedManuallyulDeviceId、および) の前にある構造体のフィールドがulClientAddr正しい値を取得することを確認しましたか? 構造体のマーシャリングUSB_HWIDが間違っているため、残りの構造体のオフセットが 4 バイトずれている可能性がありますか?

于 2009-08-28T10:28:48.900 に答える
0

ByValTStr代わりに試してみてくださいByValArray

于 2009-08-28T08:16:11.600 に答える
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 に答える