В чем разница между структурами, содержащими bool и uint, при использовании PInvoke? - PullRequest
2 голосов
/ 21 октября 2009

Хорошо, я сейчас очень растерялся. После моего последнего вопроса несколько человек прокомментировали изменение 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, он снова начинает работать ...

Может кто-нибудь объяснить это поведение?

Мне бы очень хотелось узнать причину этого, чтобы в будущем я смог избежать этой недокументированной функции (или ошибки).

Ответы [ 3 ]

2 голосов
/ 21 октября 2009

Попробуйте установить тип поля 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

0 голосов
/ 10 ноября 2009
0 голосов
/ 22 октября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...