PInvokeを使用する場合、boolとuintを含む構造体の違いは何ですか?
質問
さて、私は今非常に混乱しています。 私の最後の質問の後、boolをuintに変更することについて複数の人からコメントがありました。
Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));
もちろん印刷するもの:
sizeof bool = 4
sizeof uint = 4
とはいえ、それから私は決裂し、とにかく彼らの提案を試してみました...構造内の単一のブールをuintに変更しました。私の人生で理解できないのは、これがうまくいった理由です...
これで動作します:
[StructLayout(LayoutKind.Sequential)]
public struct KEY_EVENT_RECORD
{
public bool bKeyDown;
public short wRepeatCount;
public short wVirtualKeyCode;
public short wVirtualScanCode;
public char UnicodeChar;
public int dwControlKeyState;
}
この構造で使用される場合:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}
しかし、この構造では壊れます:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
[FieldOffset(4)] public MOUSE_EVENT_RECORD MouseEvent;
[FieldOffset(4)] public WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
[FieldOffset(4)] public MENU_EVENT_RECORD MenuEvent;
[FieldOffset(4)] public FOCUS_EVENT_RECORD FocusEvent;
}
まだ KEY_EVENT_RECORD
構造体でbool bKeyDownをuintに変更すると、再び動作を開始します...
誰かがこの動作を説明してもらえますか?
この文書化されていない機能(バグ)を将来回避できるように、その理由を本当に知りたいです。
解決 3
新しいサンプルで質問の言い換え:
他のヒント
フィールドタイプをboolに設定して、属性[MarshalAs(UnmanagedType.Bool)]を追加してください。
[StructLayout(LayoutKind.Sequential)]
public struct KEY_EVENT_RECORD
{
[MarshalAs(UnmanagedType.Bool)]
public bool bKeyDown;
public short wRepeatCount;
public short wVirtualKeyCode;
public short wVirtualScanCode;
public char UnicodeChar;
public int dwControlKeyState;
}
MarshalAsAttribute のドキュメント UnmanagedType
のドキュメントboolsは1バイト-> sizeof(C#リファレンス)
所属していません StackOverflow