Структура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; // Поверьте мне :)
Не верь ему.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
, но не смог заставить его вернуть выше значений.
Как правильно объявить?