【发布时间】:2012-05-30 12:21:32
【问题描述】:
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。
definition at 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偏移量:4x64
结构尺寸A:8
设备路径 A 的偏移量:4
结构尺寸W:8
设备路径W偏移量:4
我尝试了StructLayout 和MarshalAs 参数的所有可能组合,但我无法让它返回上述值。
什么是正确的声明?
【问题讨论】:
-
@JamieSee 我有。也是错的。
4大小无效。
标签: c# winapi pinvoke memory-alignment