Internet Explorer — Предоставление методов для JS в CAxWindow из BHO (C ++)

У меня есть этот BHO, который я успешно представил метод JS из него с помощью этой темы: Вызов метода BHO из Javascript?.

Когда я открываю CAxWindow для размещения HTML-документов, я хотел бы использовать этот экспортированный метод, но кажется, что он не работает и для этого окна.

Я пытался сделать собственный класс, как:

class Bubble:
public CAxWindow,
public IDispEventImpl<1, Bubble, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>
{
public:

BEGIN_SINK_MAP(Bubble)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE , OnDocumentComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOWNLOADCOMPLETE , OnDownloadComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR, NavigateError)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2 , OnNavigateComplete2)
END_SINK_MAP()

Чтобы попытаться повторить процесс раскрытия методов в документе завершен, но кажется, что событие не запускается.

Итак, в основном мой вопрос: есть ли способ открыть js методы для моего CAxWindow?

Большое спасибо!

0

Решение

IDispEventImpl реализует интерфейс приемника для обработки вызовов методов событий. Вы не можете расширять его своими собственными дополнительными методами напрямую. Кроме того, JavaScript на самом деле не видит этот интерфейс из кода сценариев, поскольку он подключен к сайту управления ActiveX, а не к механизму сценариев. IDispEventImpl это вообще упрощенная реализация IDispatch COM интерфейс, счетчик ссылок бесплатный, подходит для мероприятия IDispatch::Invoke вызовите интерфейс приемника точки подключения.

Вам нужно либо реализовать COM-объект с поддержкой библиотеки типов с помощью IDispatch интерфейс (библиотека типов используется механизмом сценариев для обнаружения реальных методов) или пользовательский IDispatch или же IDispatchEx реализация интерфейса (да, это может быть реализовано непосредственно на CAxWindow класс как дополнительный базовый класс / интерфейс) обработка разрешения имени метода без библиотеки типов. Затем вы передадите этот объект скриптовому движку как external объект или иначе.

1

Другие решения

Других решений пока нет …