質問

C#でCOMインターフェイス宣言を作成するときに、「ルール」があります。あなたは固執する必要がありますか?私はそれについていくつかの情報があると思います。たとえば、ITaskbarList、ITaskbarList2、ITaskbarList3の各インターフェイスをいじっていますが、私は私には

  • マネージ実装のメンバーの順序は、アンマネージインターフェイスの宣言に表示される順序で正確に宣言する必要があります。

たとえば、次の例は問題なく動作しているようです

[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("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);
}
  • マネージドインターフェイスで継承を使用する代わりに、単一のマネージドインターフェイス宣言で継承されたアンマネージドインターフェイスを宣言する必要があります。新しいインターフェイスごとに親宣言を再宣言するのではなく、アンマネージインターフェイスをそれぞれ独自のマネージインターフェイス(Guid属性などを備えた完全な)で宣言し、その間で継承を使用します。

たとえば、これは機能していないようです

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

代わりに、次のことを強制されます

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

つまり、メンバーの順序を考慮しながら、単一のインターフェースで宣言します。

では、アンマネージカウンターパートのマネージインターフェイスを宣言するためのガイドラインは何ですか?とにかく私が望むものを達成するためにあります、それは管理された側のインターフェース継承+私が望む任意の順序でメンバーを宣言します(私は本当にアルファベット順に並べたいだけです)

役に立ちましたか?

解決

あなたの発見は同じことによって引き起こされます:vtables。 vtableの順序を変更することはできません。また、他のインターフェイスから継承するインターフェイスには、常にvtable内のすべてのベースエントリもあります。したがって、探しているルールは" vtableが同じであることを確認してください"

です。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top