Как получить указатель IHTMLElement на тег <object>, на котором размещен элемент управления activex - PullRequest
4 голосов
/ 05 ноября 2010

У меня есть элемент управления ActiveX, сгенерированный платформой FireBreath (http://firebreath.org). Мне нужно получить ссылку на тег на странице, на которой размещается плагин из C ++.

Если я использовал NPAPI, Я бы использовал константу NPNVPluginElementNPObject с NPN_GetValue.

, чтобы убедиться, что мне ясно, скажем, у меня есть следующее на странице:

Я хочу получить ссылку на плагин, как если бы я использовал document.getElementById ("testPlugin"), за исключением кода C ++ элемента управления activex, вставленного для этого mimetype.

Обратите внимание, что передача идентификатора как

не является хорошим вариантом для меня, но если есть способ получить идентификатор из элемента управления activex, который может работать.

edit: Я рассматриваю возможность использования getElementsByTagName и пытаюсь найти его через DOM, но было бы трудно определить разницу между двумя экземплярами одного и того же плагина.

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Благодаря вкладчику FireBreath jtojanen из Финляндии у нас наконец-то есть решение.

Первое, что COM-объект должен быть зарегистрирован как «Квартира», а не «Один» (в реестре). В противном случае это не сработает; похоже, ошибка в COM.

Затем в любом месте после вызова SetClientSite вы можете сделать следующее:

CComQIPtr<IOleControlSite> site(m_spClientSite);
CComPtr<IDispatch> dispatch;
site->GetExtendedControl(&dispatch);
CComQIPtr<IHTMLElement2> htmlElement = dispatch;

Надеюсь, это сэкономит кому-то время; Мне понадобилось почти 2 года, чтобы найти человека, который мог бы ответить на этот вопрос.

Объект в htmlElement будет тегом , который оборачивает ваш плагин; так что если вы запрашиваете интерфейс для любого из ваших интерфейсов, он должен быть успешным, но на самом деле он не может быть буквально вашим объектом, скорее всего, он будет оберткой для вашего объекта.

0 голосов
/ 02 октября 2014

В C #:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }
...