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
参数组合,但无法得到上述值。请问正确的声明是什么?
4
不是一个有效的尺寸。 - GSerg