1

我正在尝试将一种结构从 VB 传递给 C。

这个结构只有 2 个成员。问题是只有第一个成员保持该值。

我想这是每个成员的大小问题,但我不知道如何解决。

示例和代码:

VB .Net 代码:

<DllImport("UserMode_C.dll")> _
Shared Sub someExample(ByVal handleOfSomething As IntPtr, ByRef Filter As __Structure)
End Sub

 <StructLayout(LayoutKind.Sequential)> _
    Structure __Structure
        <MarshalAs(UnmanagedType.U8)> Public UsbSerial As ULong
        <MarshalAs(UnmanagedType.U8)> Public UsbType As ULong
End Structure

Dim Buffer As New __Structure
Buffer.UsbSerial = 123456
Buffer.UsbType = 8

Device = 123456

someExample(Device, Buffer)

C代码:

typedef struct __Structure{
      ULONG  UsbSerial;
      ULONG  UsbType;
}__Structure, *__Structure;

#define DllExport __declspec(dllexport)


EXTERN_C
{

      DllExport void someExample(HANDLE handleOfSomething, __Structure* Filter)
      {
           //
           // Here we have
           //   Filter.UsbSerial = 123456
           //   Filter.UsbType = 0        <<<--- this is wrong! I sent 8.
           /* ... */
      }
}
4

1 回答 1

3

VB.NET 中的ULong类型是 64 位(8 字节)无符号整数。在 Windows 上,ULONGC 中的类型是 32 位(4 字节)无符号整数(VB.NET 数据类型大小的一半)。

要修复它,只需将结构更改为,使用UInteger带有 的类型UnManagedType.U4,如下所示:

<StructLayout(LayoutKind.Sequential)>
Structure __Structure
    <MarshalAs(UnmanagedType.U4)> Public UsbSerial As UInteger
    <MarshalAs(UnmanagedType.U4)> Public UsbType As UInteger
End Structure
于 2013-05-10T12:35:14.993 回答