SP_DEVICE_INTERFACE_DETAIL_DATA
结构:
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA {
DWORD cbSize;
TCHAR DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA;
如何在 C# 中声明它才能Marshal.SizeOf
正常工作?
我没有分配动态缓冲区的问题。我只想以cbSize
适当的、非硬编码的方式计算。
PInvoke.net上的定义是错误的。
PInvoke.net 上的解释也是错误的:
SP_DEVICE_INTERFACE_DETAIL_DATA didd = new SP_DEVICE_INTERFACE_DETAIL_DATA(); didd.cbSize = 4 + Marshal.SystemDefaultCharSize; // trust me :)
不要相信他。
4 + Marshal.SystemDefaultCharSize
仅在 x86 上有效。对sizeof(int) + Marshal.SystemDefaultCharSize
. 在 x64 上,它惨遭失败。
这是非托管 C++ 提供的:
x86
结构体 大小 A:5
设备路径偏移量 A:结构体4
大小 W:6
设备路径偏移量 W:4
x64
结构体 大小 A:8
设备路径偏移量 A:结构体4
大小 W:8
设备路径偏移量 W:4
我尝试了所有可能的StructLayout
和MarshalAs
参数组合,但我无法让它返回上述值。
什么是正确的声明?