Domanda

Quando si creano dichiarazioni dell'interfaccia COM in C # ci sono delle "regole" devi attenersi a? Penso che ci siano e vorrei avere qualche informazione al riguardo. Ad esempio, sto giocando con le interfacce ITaskbarList, ITaskbarList2 e ITaskbarList3 e mi sembra che io

  • Devono dichiarare l'ordine dei membri nell'implementazione della gestione esattamente nell'ordine in cui compaiono nella dichiarazione dell'interfaccia non gestita.

Ad esempio, quanto segue sembra funzionare bene

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

Durante il riordino dei membri si rompe la funzionalità

[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);
}
  • Devono dichiarare interfacce non gestite ereditate in un'unica dichiarazione di interfaccia gestita invece di utilizzare l'ereditarietà sulle interfacce gestite. Voglio dichiarare ciascuna delle interfacce non gestite nella propria interfaccia gestita (completa di attributi Guid, ecc.) E utilizzare l'ereditarietà tra di loro, invece di redigere le dichiarazioni dei genitori in ogni nuova interfaccia.

Ad esempio, questo non sembra funzionare

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

Invece sono costretto a fare quanto segue

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

Vale a dire dichiararlo in una singola interfaccia tenendo ancora in considerazione l'ordine dei membri.

Quindi quali sono le linee guida per dichiarare le interfacce gestite per le loro controparti non gestite? Esiste comunque per ottenere ciò che voglio, interfaccia l'ereditarietà sul lato gestito + dichiara i membri nell'ordine che desidero (voglio davvero ordinarli alfabeticamente)

È stato utile?

Soluzione

Le tue scoperte sono causate dalla stessa cosa: vtables. Non è possibile modificare l'ordine della vtable e anche le interfacce che ereditano da altre interfacce hanno sempre tutte le voci di base nella vtable. Quindi, le regole che stai cercando è " assicurati che la vtable sia la stessa. & Quot;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top