2

わかりました、私は今非常に混乱しています。 私の最後の質問の後、 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

そうは言っても、私はそれから故障し、とにかく彼らの提案を試してみました...構造内の単一のboolを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;
}

しかし、構造体で bool bKeyDown を uint に変更すると、KEY_EVENT_RECORD再び機能し始めます...

誰かがこの動作を説明できますか?

将来、この文書化されていない機能 (別名バグ) を回避できるように、その理由を知りたいです。

4

3 に答える 3

2

フィールド タイプを 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;
}

UnmanagedTypeMarshalAsAttribute ドキュメントのドキュメント

于 2009-10-21T19:17:27.217 に答える
0

新しいサンプルで言い換えられた質問:

LayoutKind.Explicit を使用したブール マーシャリング、これは壊れているか、設計どおりに失敗していますか?

于 2009-11-09T21:28:24.933 に答える
0

bools は 1byte --> sizeof (C# リファレンス)

また、ブール型のデフォルトのマーシャリングも参照してください。

于 2009-10-21T21:04:42.663 に答える