Frage

Ok, ich bin jetzt sehr verwirrt. Nach meiner letzten Frage hatte mehrere Leute Kommentar über Bool Wechsel in uint ich überprüft sie die gleiche Größe von:

    Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
    Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));

Welche natürlich druckt:

sizeof bool = 4
sizeof uint = 4

Das heißt, ich dann brach und gab ihre Vorschläge einen Versuch sowieso ... eine einzige Bool innerhalb einer Struktur zu einem uint ändern. Was ich kann nicht für das Leben von mir herauszufinden, warum diese es geschafft arbeiten ...

So funktioniert das:

[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;
}

Wenn in dieser Struktur verwendet:

[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
    [FieldOffset(0)] public short EventType;
    [FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}

Aber in dieser Struktur bricht es:

[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;
}

Doch wenn ich Bool bKeyDown ändern in der KEY_EVENT_RECORD Struktur in uint es wieder zu arbeiten beginnt ...

Kann jemand bitte dieses Verhalten erklären?

Ich möchte wirklich, warum es wissen, so dass ich diese nicht dokumentierte Funktion vermeiden kann (auch bekannt als Fehler) in die Zukunft.

War es hilfreich?

Andere Tipps

Versuchen Sie, den Feldtyp das Attribut in bool und fügen Sie [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;
}

Docs für MarshalAsAttribute Docs für UnmanagedType

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top