Pinvoke를 사용할 때 Bool과 UINT를 포함하는 구조의 차이점은 무엇입니까?

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

문제

좋아, 나는 이제 매우 혼란스러워. 마지막 질문 후 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

즉, 나는 파열되어 어쨌든 그들의 제안을 시도했다. 내가 내 삶을 위해 알아낼 수없는 것은 이것이 왜 작동하게 만든 이유입니다 ...

그래서 이것은 작동합니다 :

[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 구조 다시 작동하기 시작합니다 ...

누군가이 행동을 설명해 주시겠습니까?

앞으로이 문서화되지 않은 기능 (일명 버그)을 피할 수 있도록 그 이유를 알고 싶습니다.

도움이 되었습니까?

다른 팁

필드 유형을 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;
}

문서 마샬라 스트리트문서 UnmanagedType

부울은 1 비트 ->입니다 크기 (C# 참조)

또한 참조하십시오 부울 유형의 기본 마샬링

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top