سؤال

أقوم بتطوير عنصر تحكم ActiveX الذي يتم استخدامه في معظم الأحيان في تطبيقات WinForms.

يحتوي عنصر تحكم ActiveX على مربع حوار "صفحة خاصية"، والذي يمكن إظهاره برمجيا استخدام طريقة ShowProperTyPages على فئة Axhost. هذا هو UI المخصص الذي يمكن طرحه في Visual Studio لتحرير خصائص عنصر تحكم.

يحتوي مربع حوار صفحة الخصائص هذه على عنصر تحكم ListBox الذي يستخدم ImageList لعرض الرموز بجوار العناصر القائمة. هذه الرموز هي الصور النقطية ألفا المخلوطة ألفا 32 بت. من أجل هذه لعرضها بشكل صحيح، الإصدار 6.0 أو أعلى من comctl32.dll يجب أن تستخدم.

لسوء الحظ عندما أقوم بتشغيل تطبيق WinForms الخاص بي، يتم تحميل ويستخدم إصدار comctl32.dll 5.xxx.. وبعد نتيجة لذلك، عند عرض مربع حوار صفحة الخصائص، تبدو الرموز سيئة (يتم رسم المناطق شبه الشفافة باللون الأسود الصلب).

سؤالي هو: هل هناك أي طريقة يمكنني التأكد من استخدام الإصدار 6.0+ Comctl32.dll من داخل صفحة خاصية ActiveX Control's UI، بغض النظر عن ما تستخدم العملية؟ أو هل يمكنني إجبار العملية المضيفة على استخدام الإصدار 6.0؟ (لا أعتقد ذلك، لأنني أفكر في أن العملية المضيفة قد تكون قد قمت بالفعل بتحميل comctl32.dll في الذاكرة قبل أي من التعليمات البرمجية في عنصر تحكم ActiveX.

صفحة الويب هذه يغطي بعض السيناريوهات لاستخدام COMCTL32 6.0، ولكن ليس الوضع الذي أنا فيه.

هل كانت مفيدة؟

المحلول

كانت مقالة MSDN الأصلية مربكة لي لأنها تركز على عدد من السيناريوهات المحددة، أي منها تطابق الألغام. في الواقع، فإن التكنولوجيا الأساسية التي تتحدث عن الأعمال بشكل عام.

بواسطة إضافة ملف XML "بيان" مورد إلى ActiveX DLL، يمكنني الإشارة إلى النظام الجانبي الذي أريد أن يستخدم DLL لاستخدام Comctl32.dll 6.x. ثم يتم تحميل هذا الإصدار تلقائيا. لطيفة جدا.

يحتاج هذا البيان إلى أن يكون نوع الموارد rt_manifest., مع معرف مورد 2.

إليك دليل النجاح (نسختان من نفس DLL محملة في نفس العملية!):procexp screenshot showing two COMCTL32's loaded in process

(أيضا، تظهر الرموز بشكل صحيح في القائمة ;))

نصائح أخرى

إذا كان تطبيق طلبك يطلق التطبيق. القابلية () (عادة قبل استدعاء Application.run () لبدء حلقة رسالة)، يجب استخدام الإصدار 6+ من مكتبة التحكم الشائعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top