Question

Lors de la création de déclarations d'interface COM en C #, existe-t-il des "règles"? vous devez vous en tenir à? Je pense qu'il y en a et aimerais avoir des infos à ce sujet. Par exemple, je m'amuse avec les interfaces ITaskbarList, ITaskbarList2 et ITaskbarList3 et il me semble que je

  • Doit déclarer l'ordre des membres dans l'implémentation manage exactement dans l'ordre dans lequel ils apparaissent dans la déclaration d'interface non gérée.

Par exemple, ce qui suit semble bien fonctionner

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

Lors de la réorganisation des membres, la fonctionnalité est interrompue

[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);
}
  • Doit déclarer les interfaces non gérées héritées dans une déclaration d'interface gérée unique au lieu d'utiliser l'héritage sur les interfaces gérées. Je souhaite déclarer chacune des interfaces non gérées dans leur propre interface gérée (avec les attributs Guid, etc.) et utiliser l'héritage entre eux au lieu de redéclarer les déclarations parentes dans chaque nouvelle interface.

Par exemple, cela ne semble pas fonctionner

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

Au lieu de cela, je suis obligé de faire ce qui suit

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

Je le déclare dans une seule interface tout en tenant compte de l'ordre des membres.

Quelles sont donc les instructions à suivre pour déclarer des interfaces gérées pour leurs homologues non gérées? Y a-t-il un moyen d'obtenir ce que je veux, l'héritage d'interface du côté géré + déclarer les membres dans l'ordre que je veux (je veux vraiment les trier par ordre alphabétique)

Était-ce utile?

La solution

Vos découvertes sont causées par la même chose: vtables. Vous ne pouvez pas modifier l'ordre de vtable, et les interfaces héritées d'autres interfaces ont toujours toutes les entrées de base dans vtable. Ainsi, les règles que vous recherchez sont les suivantes: "assurez-vous que la vtable est la même".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top