Правильно объявить SP_DEVICE_INTERFACE_DETAIL_DATA для PInvoke

Структура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, но не смог заставить его вернуть выше значений.

Как правильно объявить?

9
задан GSerg 23 May 2012 в 22:13
поделиться