¿Cuál es la diferencia entre las estructuras que contienen bool vs uint cuando se usa PInvoke?

StackOverflow https://stackoverflow.com/questions/1602899

Pregunta

Ok, ahora estoy muy confundido. Después de mi última pregunta varias personas comentaron sobre cambiar bool a uint, verifiqué que son del mismo tamaño:

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

Que por supuesto imprime:

sizeof bool = 4
sizeof uint = 4

Dicho esto, luego me rompí y probé sus sugerencias de todos modos ... Cambiando un solo bool dentro de una estructura a un uint. Lo que no puedo entender por mi vida es por qué esto lo hizo funcionar ...

Entonces esto funciona:

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

Cuando se usa en esta estructura:

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

Pero en esta estructura se rompe:

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

Sin embargo, cuando cambio bool bKeyDown a uint en la estructura KEY_EVENT_RECORD , comienza a funcionar de nuevo ...

¿Puede alguien explicar este comportamiento?

Realmente me gustaría saber el por qué para poder evitar esta característica no documentada (también conocida como error) en el futuro.

¿Fue útil?

Otros consejos

Intente configurar el tipo de campo en bool y agregue el atributo [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;
}

Documentos para MarshalAsAttribute Los documentos para UnmanagedType

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top