تعامل مع HTMLELEMENEMENEMENTEVENT2 عند معالجة dwebbrowserevents2 باستخدام وحدات ماكرو ATL

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

سؤال

أقوم بإنشاء كائن مساعد مستعرض باستخدام VS2008، C ++. تم اشتقاق صفي من Idispeventimpl بين العديد من الآخرين

class ATL_NO_VTABLE CHelloWorldBHO :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
    public IObjectWithSiteImpl<CHelloWorldBHO>,
    public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

{
.
.
.
BEGIN_SINK_MAP(CHelloWorldBHO)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
END_SINK_MAP()
.
.
.
}

كما هو واضح من التعليمات البرمجية أعلاه، يتم التعامل مع بلدي dwebbrowserevents2 باستخدام وحدات ماكرو ATL. الآن أريد التعامل مع HTMLELEMENEMENEMENEMENTEVENTS2 (للكشف عن النقرات والأشرطة التمريرية، إلخ) لذلك، أنا QueryInterface () كائن IHTMLDOCument 2 ل IHTMLELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELENTANIONER و ConnectionPointAner و ContectionPointContainer :: FindConnectionPoint (DiID_HTMLELELEMENTECENTER2). (يرى مقالة MSDN في التعامل مع htmlelementevents2). المشكلة هي، عندما قمت بالكتابة فوق IDispatch :: Invoke في صفي، تفشل مقابض dwebbrowserevents2 (التي تم إنشاؤها باستخدام ماكرو ATL). هل هناك طريقة للتعامل مع HTMLELELEMENEMENEMENEMENTER2 دون استدعاء الكتابة فوقها، أو قم بتنفيذ استدعاء بهذه الطريقة التي تعالجها فقط HTMLELELEMENEMENTEVENTS2؟
شكرا، سيتم تقدير أي مساعدة.

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

المحلول

لا توجد حاجة حقيقية لتجاوز الاحتجاج أو الحصول على iconnectionpointainer. نظرا لأن هذا مشروع ATL، فإن تنفيذ Idispeventimpl آخر:

public IDispEventImpl<2, CHelloWorldBHO, &DIID_HTMLTextContainerEvents2, &LIBID_MSHTML, 4, 0>

عمل الحيلة. ثم، تغرق الدخول على النحو التالي:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

في OnDocumentcomplete، اتصل IWebBrowser2 :: get_document، ihtmldocument2 :: get_body، ثم استدعاء dispeventadvise لبدء تلقي الأحداث.

لاحظ أنني استخدمت diid_htmltextcontainerevents2 بدلا من diid_htmlelementevents. ذلك لأن كائن الجسم لا يدعم HTMLELELEMENEMENTEVENTS2، وللهدف (للتعامل مع التمرير) هذا يعمل بشكل جيد فقط!

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