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;
Marshal.SizeOf
C# で正しく動作するように宣言するにはどうすればよいですか?
動的バッファーの割り当てに問題はありません。ハードコードされていない適切な方法で計算したいだけです。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
ましたが、上記の値を返すことができませんでした。
正しい申告は?