هو تفعيل خالية من التسجيل ممكن ل إكس (خارج العملية) خوادم كوم?

StackOverflow https://stackoverflow.com/questions/3211345

  •  13-09-2020
  •  | 
  •  

سؤال

وأنا أعلم أنه يمكننا استخدام كولوادليبراري و دلجيتكلاسوبجيكت للحصول على واجهة إكلاسفاكتوري والحصول على واجهة مكون كوم دون تسجيل دل.

ولكن ماذا عن مكون كوم في إكس?هل هناك طريقة يمكنني الحصول على واجهة مكون كوم من خادم إيكس من نوع كوم فقط عن طريق توفير مسار ملف مختلف?

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

المحلول

إذا كنت تستخدم حقيقي تسجيل مجاني، يجب أن تكون قادرا على الحصول على هذا العمل في كائنات COM داخل Proc و Out-of-of-of of of off.

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

نصائح أخرى

لا ، لا يمكنك.تحتاج كوم الإعداد التنظيم بين البرنامج الخاص بك وخارج بروك كوم الخادم.لتحقيق ذلك عليك الاتصال CoInitialize() ثم إما CoCreateInstance() أو CoGetClassObject().

المسار الذي تصفه مع استدعاء خادم في بروك CoLoadLibrary() ثم DllGetClassObject() - هو في الواقع الإختراق القذرة - أنه يتجاوز آليات كوم العادية وهكذا على سبيل المثال لا حشد سوف ركلة في حتى لو كان هناك حاجة لتلبية متطلبات نموذج خيوط (ستا/متا الاشياء).هذا الإختراق القذرة هو ممكن لأن خادم في بروك هو دل العادية مع العديد من الوظائف المعروفة المكشوفة.والشيء نفسه مستحيل لخادم كوم خارج بروك - تحتاج إلى الاعتماد على كوم في هذه الحالة.

يمكنك تمرير مكون كوم في استدعاء وظيفة ، كمؤشر.

لذلك افترض أنك تنفيذ كائن في إكس الخاص بك ، والذي يحمل كائن كوم آخر من دل ، يمكنك تمرير الكائن القائم على إكس إلى الكائن من دل.سيحتاج الكائن المحمل إلى دعم واجهة لها وظيفة تقبل المؤشر ، على سبيل المثال.

interface ILoadedObject
{
    HRESULT GiveObject(IUnknown *pObj);
};

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

المتطلبات الوحيدة هي على التنفيذ الصحيح ل IUnknown:لا تدمر الكائن حتى Release وقد دعا العدد الصحيح من المرات ، وضمان أن QueryInterface يمكن استخدامها لاجتياز بين مجموعة ثابتة من واجهات على الكائن وأن الاستعلام عن IUnknown دائما إرجاع نفس العنوان.

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

تحديث

وهناك حل أكثر اكتمالا هو تحديد طريقة قياسية لإنشاء مثيل من نوع الكائن ، ولكن للسماح إكس لتحديد كيف يعمل.سوف إكس تنفيذ:

interface IComponent;

interface IEnvironment : IUnknown
{
    HRESULT CreateInstance(REFCLSID clsid, IComponent **ppNew);
}

يجب أن يدعم كل مكون هذه الواجهة:

interface IComponent : IUnknown
{
    HRESULT SetEnvironment(IEnvironment *pEnv);
}

الآن ، للحصول على السلوك القياسي حيث يريد إكس استخدام التسجيل للعثور على المكونات ، فإنه يمكن تنفيذ CreateInstance طريقة مثل هذا:

HRESULT Env::CreateInstance(REFCLSID clsid, IComponent **ppNew)
{
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
                     __uuidof(IComponent), (void **)&ppNew);
    if (FAILED(hr))
        return hr;

    (*ppNew)->SetEnvironment(this);
    return S_OK;
}

ولكن بالطبع يمكن أن يغير هذا و" حقن " بعض المكونات.لذلك بدلا من (أو بالإضافة إلى) التسجيل ، يمكن استخدام ملف التكوين.أو (كما كنت قد طلبت) إكس يمكن أن يكون المدمج في تطبيقات بعض المكونات:

نظرا لأنه يتم إخطار كل مكون بالبيئة عند إنشائه ، يمكنه استخدام البيئة لإنشاء مكونات أخرى:

// inside some component:
HRESULT Comp::SetEnvironment(IEnvironment *e)
{
    m_env = e; // using a smart pointer for ref-counting
    return S_OK;
}

// in some method of the component

ComPtr<IComponent> button;
m_env->CreateInstance(CLSID_Button, &button);

// now query button for more useful interface...

لذلك عندما يتم إنشاء مكون ، يمكن للبيئة (المحددة في إكس) التحكم بالضبط في كيفية العثور على تنفيذ المكون.كل خلق يذهب عبر إكس.

وهذا ما يسمى أحيانا "حقن التبعية"أو" انعكاس السيطرة".

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