تعامل مع HTMLELEMENEMENEMENTEVENT2 عند معالجة dwebbrowserevents2 باستخدام وحدات ماكرو ATL
-
12-09-2019 - |
سؤال
أقوم بإنشاء كائن مساعد مستعرض باستخدام 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، وللهدف (للتعامل مع التمرير) هذا يعمل بشكل جيد فقط!