سؤال

ولدي عنصر ATL COM 32 بت بدون مكتبة نوع. كان لديه مصنع فئة لفئة واحدة بالنظر إلى أن تنفذ عدة واجهات.

عند استخدمه كخادم في بروك، كل شيء يعمل على ما يرام - جانب العميل استدعاء CoCreateInstance ()، يتم إنشاء مثيل الكائن وQueryInterface () باسترداد مؤشر إلى واجهة المطلوبة. ولكن عندما أضع المكون في COM + أنا لم يعد يمكن إنشاء مثيل الطبقة - CoCreateInstance () إرجاع الآن E_NOINTERFACE

وأعتقد أن المشكلة هي أن COM + لا يمكن إجراء التعبئة بسبب عدم وجود مكتبة نوع - ليس لديها أي فكرة عن كيفية القيام بذلك. هل أنا بحاجة لتوليد وتسجيل مكتبة نوع لحل هذه أو هل هناك أي طريقة أخرى؟

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

المحلول

وأورك. أوصي يسأل على microsoft.public.vc.atl كما أعتقد أنك سوف تجد أكثر الخبراء هناك. أعتقد (على الرغم من أنني لست خبيرا) قضية لديه أقل للقيام مع COM + من قضية وكيل مسجلة / بذرة. (وبعبارة أخرى، حتى لو أنك كتبت العميل COM الخاصة بك للوصول إلى مكون الخاص بك خارج العملية، وكنت ربما واجهت نفس المشكلة) إذا كان لديك واجهات أتمتة متوافق القياسية، ثم يعرف ويندوز كيفية تنظيم الأشياء الخاصة بك فقط غرامة. لكن على خلاف ذلك الخلط بين ذلك.

وبدون مكتبة نوع، تحتاج إما لتسجيل وكيل / بذرة، أو الحاجة إلى تنفيذ IMarshal نفسك للتعامل مع التعبئة المخصصة. (أو هناك أيضا هذا "معالج التنظيم" الشيء الذي أنا لا أفهم)

وتعليقك حول لماذا لم يكن لديك مكتبة نوع (تنفيذ واجهة المعرفة بالفعل من قبل مايكروسوفت، ولكن الذي لم يكن لديك typelib) يثير العلم الاحمر معي. هل يمكنك أن تعطي معلومات إضافية؟ إذا كان شيء في. DLL أو .EXE، ولكن المعلومات النوع هو داخل المكتبة نفسها (بدلا من الملف .tlb خارجي) من المحتمل أن يكون من الممكن استخراج المعلومات الصحيحة لجعل عمل كل شيء، أنا فقط لا دراية معالجة.

و(للسجل، لقد تركت البرمجة / COM ATL لصالح جافا، لذلك على الرغم من أنني يمكن أن تتيح لك معرفة ما أتذكر في الماضي، وأنا لا تستخدم أدوات الآن وسيكون من الصعب بالنسبة لي لنعود إليها لتقديم أي مساعدة أخرى. ولكن الناس على microsoft.public.vc.atl أذكياء جدا).

نصائح أخرى

وTypelibs هي وسيلة واحدة لدعم دلس التنظيم، وكيل / كعب (genereated من IDL) هي آخر. في كلتا الحالتين، ومع ذلك، سوف تحتاج إلى المختبر الدولي للألماس في المقام الأول.

إذا مايكروسوفت لا توفر DLL typelib / وكيل أو IDL لهذه الواجهة، الاحتمالات هي أن هناك سبب لذلك: ربما يستخدم واجهة هياكل البيانات غير marshalable، يتطلب مؤشرات الدالة لتمريرها كمعلمة أسلوب أو الأشياء مثله؟ إذا كان هذا هو الحال، هناك فقط أي وسيلة لجعل هذا العمل اجهة لDCOM.

وربما يمكنك إعادة بناء IDL، ولكن من المحتمل جدا، هو فقط لن يكون مجديا. ثم يمكن أن يكون تراجع الأخير إلى استخدام العرف أو معالج التنظيم، ولكن هذا ربما لا يستحق كل هذا الجهد. وقال، أنصح النظر في الطرق الأخرى التي لا تنطوي على استخدام واجهات لDCOM التي لم تكن مصممة لاستخدامها في DCOM.

لواجهة COM لتكون marshallable استخدام marshaller الافتراضي مايكروسوفت، واجهة لا بد أن يكون إما DUAL أو الممتلكات OLEAUTOMATION تعريف في رأسها.

إذا هناك حجج لأساليب محددة أنه لا مؤشرات واجهة، وهو نفس الشرط يمتد إلى تلك الواجهات.

وبالإضافة إلى ذلك يجب أن يكون اسم واجهة موجودة في المقطع مكتبة IDL تحديده. هذا يمتد أيضا إلى واجهات المشار أخرى.

إذا لم تتحقق هذه الشروط، واجهة لن تكون marshallable.

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