Frage

Wenn COM-Schnittstelle Deklarationen in C # zu schaffen gibt es irgendwelche „Regeln“ Sie müssen bleiben? Ich denke, es und würde gerne einige Informationen über sie erhalten. Zum Beispiel bin liebäugelt ich mit den ITaskbarList, ITaskbarList2 und ITaskbarList3 Schnittstellen um und es scheint mir, dass ich

  • Haben Sie die Reihenfolge der Mitglieder zu erklären, in der Umsetzung genau in der Reihenfolge verwaltet, dass sie in der nicht verwalteten Interface-Deklaration erscheinen.

Zum Beispiel folgende erscheint gut zu funktionieren

[ComImport]
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList
{
    void HrInit();
    void AddTab([In] IntPtr hwnd);
    void DeleteTab([In] IntPtr hwnd);
    void ActivateTab([In] IntPtr hwnd);
    void SetActiveAlt([In] IntPtr hwnd);
}

Während die Mitglieder Neuordnungs bricht die Funktionalität

[ComImport]
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList
{
    void DeleteTab([In] IntPtr hwnd);
    void HrInit();
    void AddTab([In] IntPtr hwnd);
    void SetActiveAlt([In] IntPtr hwnd);
    void ActivateTab([In] IntPtr hwnd);
}
  • geerbt haben nicht verwalteten Schnittstellen in einer einzigen verwaltete Schnittstelle Erklärung zu erklären, anstatt Vererbung auf den verwalteten Schnittstellen zu verwenden. Ich möchte, dass jeder der nicht verwalteten Schnittstellen in ihre eigenen verwaltete Schnittstelle (komplett mit Guid Attribute usw.) zu erklären und Vererbung dazwischen dann, statt erneut deklariert die Eltern Erklärungen in jeder neuen Schnittstelle.

Zum Beispiel, dies scheint nicht zu funktionieren

[ComImport]
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList
{
    void HrInit();
    void AddTab([In] IntPtr hwnd);
    void DeleteTab([In] IntPtr hwnd);
    void ActivateTab([In] IntPtr hwnd);
    void SetActiveAlt([In] IntPtr hwnd);
}

[ComImport]
[Guid("602D4995-B13A-429B-A66E-1935E44F4317")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList2
    : ITaskbarList
{
    void MarkFullscreenWindow(
        [In] IntPtr hwnd,
        [In, MarshalAs(UnmanagedType.Bool)] bool fullscreen);
}

Stattdessen bin ich gezwungen, zu tun, das folgende

[ComImport]
[Guid("602D4995-B13A-429B-A66E-1935E44F4317")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList2
{
    void HrInit();
    void AddTab([In] IntPtr hwnd);
    void DeleteTab([In] IntPtr hwnd);
    void ActivateTab([In] IntPtr hwnd);
    void SetActiveAlt([In] IntPtr hwnd);
    void MarkFullscreenWindow(
        [In] IntPtr hwnd,
        [In, MarshalAs(UnmanagedType.Bool)] bool fullscreen);
}

D.h. erklären sie in einer einzigen Schnittstelle, während immer noch das Element, um in Betracht gezogen wird.

Also, was sind die Richtlinien für ihre nicht verwalteten Pendants verwalteten Schnittstellen deklarieren? Gibt es trotzdem zu erreichen, was ich will, es Vererbung Schnittstelle auf der verwalteten Seite + erklären die Mitglieder in einer beliebigen Reihenfolge ich will (ich wirklich will, nur um sie alphabetisch sortieren)

War es hilfreich?

Lösung

Ihre Entdeckungen werden durch die gleiche Sache verursacht: vtables. Sie können nicht die VTable Reihenfolge ändern, und Schnittstellen, die immer von anderen Schnittstellen erben haben alle Basen Einträge in der Vtable auch. So sind die Regeln, die Sie suchen ist „sicherstellen, dass die V-Tabelle gleich ist.“

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