كيفية الحصول على مؤشر IHTMLElement إلى TAG استضافة عنصر تحكم ActiveX
-
29-09-2019 - |
سؤال
لدي عنصر تحكم نشط تم إنشاؤه بواسطة إطار Firebreath (http://firebreath.org). أحتاج إلى الحصول على إشارة إلىu003Cobject> علامة في الصفحة التي تستضيف البرنامج المساعد من C ++.
إذا كنت أستخدم NPAPI ، فسأستخدم ثابت NPNVPluginElementNPOBOBJECT مع NPN_GETVALUE.
للتأكد من أنني واضح ، قل أن لدي ما يلي في الصفحة:
u003Cobject id="testPlugin" type="application/x-someplugin" width="100%" height="100%">u003C/object>
أرغب في الحصول على إشارة إلى المكون الإضافي كما لو كنت أستخدم document.getElementById ("TestPlugin") ، باستثناء من داخل رمز C ++ لعنصر تحكم ActiveX الذي يتم إدراجه في هذا التقليد.
يرجى ملاحظة أن تمرير المعرف في ASu003Cparam> ليس خيارًا جيدًا بالنسبة لي ، ولكن إذا كانت هناك طريقة للحصول على المعرف من داخل عنصر التحكم ActiveX الذي قد يعمل.
تعديل: أنا أفكر في استخدام getElementsByTagname ومحاولة العثور عليه من خلال DOM ، ولكن سيكون من الصعب معرفة الفرق بين حالتين من نفس البرنامج المساعد.
المحلول
بفضل مساهم Firebreath Jtojanen من فنلندا ، لدينا أخيرًا حل.
أول شيء هو أن كائن com يجب تكون مسجلة باسم "شقة" ، وليس "عازبة" (في السجل). خلاف ذلك ، هذا لن يعمل ؛ يبدو أن خطأ في كوم.
ثم في أي مكان بعد أن يتم استدعاء setClientsite ، يمكنك القيام بما يلي:
CComQIPtr<IOleControlSite> site(m_spClientSite);
CComPtr<IDispatch> dispatch;
site->GetExtendedControl(&dispatch);
CComQIPtr<IHTMLElement2> htmlElement = dispatch;
أتمنى أن ينقذ هذا شخصًا ما بعض الوقت ؛ لقد استغرق الأمر مني ما يقرب من عامين لأجد شخصًا يمكنه الإجابة عن هذا لي.
سيكون الكائن في htmlelement هوu003Cobject> وضع علامة على الملحق الخاص بك. لذا ، إذا قمت بالاستعلام عن أي من واجهاتك ، فيجب أن تنجح ، ولكن قد لا تكون في الواقع كائنك ، فمن المحتمل أن يكون غلافًا لكائنك.
نصائح أخرى
في C#:
public int SetSite(object site)
{
if (site != null)
{
var oleControl = (IOleControlSite)site;
object oHtmlElement;
oleControl.GetExtendedControl(out oHtmlElement);
var htmlElement = (IHTMLElement2)oHtmlElement;
...
}
}