سؤال

نقوم بتكييف تطبيق عميلنا المعقد نسبيًا (ActiveX / .NET / Delphi / C ++ / COM) لاستخدام SXS لتحقيق نشر غير المشرف وعزله عن الإصدارات القديمة لمنتجاتنا.

تمكنا من تحقيق هذا الهدف لجميع مكوناتنا في PROC تقريبًا مثل .NET UI و Delphi UI وخوادم COM التي نستخدمها في PROC عن طريق تكوين ملف واضح وصف جميع المكتبات المستخدمة في عمليتنا ، بدون تسجيل على عميل أي من المكونات (تقريبا).

وهنا يأتي الجزء تقريبًا: في الوقت الحالي ، يستدعي تطبيقنا (من جزء C ++) من خادم Proc ActiveX (Delphi Activex Exe) ، والذي بدوره يستدعي مجموعة أخرى من خوادم Proc ActiveX (مكونات إضافية لجهة خارجية ، أي شيء يسير هنا ، Delphi ، C ++ ، أي شيء طالما أنه خارج Proc Activex Exe وينفذ واجهاتنا).

كما نعلم لا تدعم SXS من خوادم Proc ActiveX. ولا يمكننا استخدام هذه الكائنات كما هو الحال في خوادم Proc Com في عمليتنا الرئيسية لأن ذلك سيتطلب إعادة كتابة رئيسية لتطبيقنا وحتى الأسوأ ، وهو استراحة من واجهة برمجة تطبيقات مواجهة الجمهور التي تستخدمها أدوات الطرف الثالث والبائعين ، API كسر الذي لا يمكننا السماح به.

لقد تعثرنا هذه المقالة الذي يصف كيف يمكن استخراج ihtmldocument2 من نافذة Internet Explorer تعمل في عملية منفصلة. مما جعلنا نفكر في هذا النهج:

سنقوم بإنشاء تطبيق / عملية قمر صناعي ثانوي سيقوم بتشغيل ActiveX كما في خادم العملية. ثم سوف نستخدم lresultFromObject و ObjectFromLresult لنقل مرجع لكائن ActiveX من تطبيق القمر الصناعي إلى عملية التطبيق الرئيسية. سيكون لتطبيق الأقمار الصناعية ملف واضح الخاص به والذي سيسمح له بالتشغيل في وضع SXS.

سيتم اتباع نفس النهج للتواصل بين Delphi Activex Exe و Plucins Acivex Exe Tired

هناك حل بديل ، والذي لا نفضل في الوقت الحالي على الحل المقترح أعلاه والذي يتم استخدامه .NET Remoting و .NET COM Proxy لفتح قناة الاتصال بين العمليتين ، من خلال ترجمة طلب COM إلى .NET عن بُعد ، والعودة إلى كوم في العملية الثانية.

إذن هنا يأتي السؤال:

  1. ما رأيكم في هذا النهج ؟
  2. هل ترى حلاً أفضل للمشكلة؟
هل كانت مفيدة؟

المحلول

من الممكن القيام به. ما هو مطلوب:

  • يحتاج التطبيق إلى بدء تشغيل خادم نفسه بدلاً من الاعتماد على COM للقيام بذلك. لا تحتاج إلى عدم التوجيه الإضافي الذي يوفره السجل ، فقط استخدم CreateProcess ().
  • يجب أن يسجل الخادم مصانعه في الفصول الدراسية بطريقة رئيسية () مع CoreGisterClassObject ().
  • هام: يجب تغيير CLSID التي يستخدمها لكل مصنع لتكون فريدة من نوعها لكل مثيل خدمة. هذا يضمن أن العميل يتصل بالخادم الصحيح. أنا ببساطة xor معرف العملية مع Class Factory Clsid. يعرف العميل معرف العملية أيضًا حتى يتمكن من إجراء نفس التغيير.
  • يجب أن يتصل التطبيق بـ cocreateinstance () في حلقة مع استدعاء Sleep () لانتظار ظهور مصنع الكائن. لا تعلن الفشل حتى مرت 60 ثانية على الأقل (هذا الأمر).
  • يحتاج كل من التطبيق والخادم إلى بيان يحتوي على ملف <file> عنصر لكل وكيل/كوب DLL و <comInterfaceExternProxyStub> عناصر لكل واجهة تم الآن.

نصائح أخرى

أليكس ،

Nobugz على حق ، يمكنك الوصول إلى جدول كائن التشغيل لإنشاء مثيل لكائن COM من عملية تشغيل حاليًا لـ Delphi Automation Exe.

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

في الأساس إذا لم يتم تسجيل X Exe النشط ، أحصل على خطأ "واجهة غير مدعومة" إذا حاولت تكوين الكائن من خلال واجهات على سبيل المثال:

webupdate: iautomation ؛

webupdate: = coautomation.create ؛ <- خطأ في العمل


webupdate: البديل ؛

webupdate: = createOleObject ('webupdate.automation') ؛ <- يعمل بشكل جيد

إذا قمت بتسجيل X Exe Active باستخدام RegServer ، فإن المشكلة تختفي !!

إذهب واستنتج!

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