سؤال

عند إنشاء إعلانات واجهة COM في C#، هل هناك أي "قواعد" يجب عليك الالتزام بها؟أعتقد أن هناك وأرغب في الحصول على بعض المعلومات حول هذا الموضوع.على سبيل المثال، أنا أتلاعب بواجهات 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);
}
  • يتعين عليك الإعلان عن الواجهات الموروثة غير المُدارة في إعلان واجهة مُدارة واحدة بدلاً من استخدام الوراثة على الواجهات المُدارة.أريد الإعلان عن كل واجهة من الواجهات غير المُدارة في الواجهة المُدارة الخاصة بها (مع استكمال السمات الإرشادية وما إلى ذلك) واستخدام الوراثة بين ذلك الحين، بدلاً من إعادة إعلان الإعلانات الأصلية في كل واجهة جديدة.

على سبيل المثال، يبدو أن هذا لا يعمل

[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