ما هو الفرق بين الهياكل التي تحتوي منطقي مقابل uint عند استخدام PInvoke?

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

سؤال

حسنا, أنا الآن في حيرة من أمري. بعد سؤالي الأخير وكان العديد من الناس التعليق حول تغيير منطقي إلى 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

إلى أن قال: ثم كسر وأعطى اقتراحات محاولة على أية حال...تغيير واحد منطقي داخل بنية 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;
}

ولكن عندما قمت بتغيير منطقي bKeyDown إلى uint في KEY_EVENT_RECORD هيكل يبدأ العمل مرة أخرى...

يمكن للشخص الرجاء تفسير هذا السلوك ؟

أود حقا أن أعرف السبب من ذلك حتى أنه يمكن تجنب هذا غير الشرعيين ميزة (الملقب علة) في المستقبل.

هل كانت مفيدة؟

نصائح أخرى

حاول تحديد نوع الحقل إلى bool و إضافة السمة [MarshalAs(UnmanagedType.منطقي)].

[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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top