代码之家  ›  专栏  ›  技术社区  ›  anselm

如何在IE Mobile上检索ipiehtmldocument2接口

  •  2
  • anselm  · 技术社区  · 16 年前

    我为IE7编写了一个ActiveX插件,除了一些其他必要的接口外,它还实现了IObjectWithSite(注意不要使用IOlclient)。此接口由IE7查询和调用。在setsite()调用期间,我检索一个指向IE7的站点接口的指针,我可以使用以下方法检索IHTMldocument2接口:

    IUnknown *site = pUnkSite; /* retrieved from IE7 during SetSite() call */
    IServiceProvider *sp = NULL;
    IHTMLWindow2 *win = NULL;
    IHTMLDocument2 *doc = NULL;
    
    if(site) {
        site->QueryInterface(IID_IServiceProvider, (void **)&sp);
        if(sp) {
            sp->QueryService(IID_IHTMLWindow2, IID_IHTMLWindow2, (void **)&win);
            if(win) {
                win->get_document(&doc);
            }
        }
    }
    if(doc) {
        /* found */
    }
    

    我在pie上尝试了类似的方法,也使用了以下代码,但是,即使是ipiehtmlwindow2接口也无法获取,所以我卡住了:

    IUnknown *site = pUnkSite; /* retrieved from PIE during SetSite() call */
    IPIEHTMLWindow2 *win = NULL;
    IPIEHTMLDocument1 *tmp = NULL;
    IPIEHTMLDocument2 *doc = NULL;
    
    if(site) {
        site->QueryInterface(__uuidof(*win), (void **)&win);
        if(win) { /* never the case */
            win->get_document(&tmp);
            if(tmp) {
                tmp->QueryInterface(__uuidof(*doc), (void **)&doc);
            }
        }
    }
    if(doc) {
        /* found */
    }
    

    使用ISeviceProvider接口也不起作用,所以我已经测试过了。

    有什么想法吗?

    2 回复  |  直到 10 年前
        1
  •  3
  •   gnobal    16 年前

    我在google gears代码中找到了以下代码, here . 我复制了我认为你需要的功能。您需要的是在底部(gethtmlwindow2),但其他两个也是需要的。希望我没有错过任何东西,但如果我做了你需要的东西可能是在链接。

    #ifdef WINCE
    // We can't get IWebBrowser2 for WinCE.
    #else
    HRESULT ActiveXUtils::GetWebBrowser2(IUnknown *site, IWebBrowser2 **browser2) {
      CComQIPtr<IServiceProvider> service_provider = site;
      if (!service_provider) { return E_FAIL; }
    
      return service_provider->QueryService(SID_SWebBrowserApp,
                                            IID_IWebBrowser2,
                                            reinterpret_cast<void**>(browser2));
    }
    #endif
    
    
    HRESULT ActiveXUtils::GetHtmlDocument2(IUnknown *site,
                                           IHTMLDocument2 **document2) {
      HRESULT hr;
    
    #ifdef WINCE
      // Follow path Window2 -> Window -> Document -> Document2
      CComPtr<IPIEHTMLWindow2> window2;
      hr = GetHtmlWindow2(site, &window2);
      if (FAILED(hr) || !window2) { return false; }
      CComQIPtr<IPIEHTMLWindow> window = window2;
      CComPtr<IHTMLDocument> document;
      hr = window->get_document(&document);
      if (FAILED(hr) || !document) { return E_FAIL; }
      return document->QueryInterface(__uuidof(*document2),
                                      reinterpret_cast<void**>(document2));
    #else
      CComPtr<IWebBrowser2> web_browser2;
      hr = GetWebBrowser2(site, &web_browser2);
      if (FAILED(hr) || !web_browser2) { return E_FAIL; }
    
      CComPtr<IDispatch> doc_dispatch;
      hr = web_browser2->get_Document(&doc_dispatch);
      if (FAILED(hr) || !doc_dispatch) { return E_FAIL; }
    
      return doc_dispatch->QueryInterface(document2);
    #endif
    }
    
    
    HRESULT ActiveXUtils::GetHtmlWindow2(IUnknown *site,
    #ifdef WINCE
                                         IPIEHTMLWindow2 **window2) {
      // site is javascript IDispatch pointer.
      return site->QueryInterface(__uuidof(*window2),
                                  reinterpret_cast<void**>(window2));
    #else
                                         IHTMLWindow2 **window2) {
      CComPtr<IHTMLDocument2> html_document2;
      // To hook an event on a page's window object, follow the path
      // IWebBrowser2->document->parentWindow->IHTMLWindow2
    
      HRESULT hr = GetHtmlDocument2(site, &html_document2);
      if (FAILED(hr) || !html_document2) { return E_FAIL; }
    
      return html_document2->get_parentWindow(window2);
    #endif
    }
    
        2
  •  2
  •   anselm    16 年前

    我已经知道齿轮代码了。Gears使用的机制是基于解决方案,通过从Gears加载程序对Gears插件执行显式方法调用来设置窗口对象,并将其用作站点接口,而不是在set site调用中由IE Mobile提供的IUnknown。关于齿轮代码,谷歌的工程师们意识到了我提出的同样的问题,并提出了我描述的解决方法。

    但是,我认为必须有另一种更“正式”的方式来处理这个问题,因为在活动X控件/插件上明确地设置站点不是很好。我现在就直接问IE移动团队,一旦我找到解决方案,我会通知你的。这可能是IE Mobile中的一个bug,这是我能想象到的最有可能的事情,但谁知道呢…

    但无论如何感谢你的回应;)