Frage

Ich habe ein ActiveDiese Schnittstelle wird vom IE7 abgefragt und aufgerufen.Während des SetSite()-Aufrufs rufe ich einen Zeiger auf die Site-Schnittstelle von IE7 ab, mit dem ich die IHTMLDocument2-Schnittstelle mithilfe des folgenden Ansatzes abrufen kann:

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 */
}

Ich habe auch bei PIE einen ähnlichen Ansatz mit dem folgenden Code versucht, allerdings kann nicht einmal die IPIEHTMLWindow2-Schnittstelle abgerufen werden, sodass ich nicht weiterkomme:

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 */
}

Die Verwendung der IServiceProvider-Schnittstelle funktioniert ebenfalls nicht, daher habe ich dies bereits getestet.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich habe den folgenden Code im Google Gears-Code gefunden: Hier.Ich habe die Funktionen, die Sie meiner Meinung nach benötigen, hierher kopiert.Die benötigte Datei befindet sich unten (GetHtmlWindow2), die anderen beiden werden jedoch ebenfalls benötigt.Hoffentlich habe ich nichts übersehen, aber ob ich das getan habe, was Sie brauchen, finden Sie wahrscheinlich unter dem Link.

#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
}

Andere Tipps

Nun, ich kannte den Getriebecode bereits.Der von Gears verwendete Mechanismus basiert auf einer Problemumgehung, indem ein expliziter Methodenaufruf in das Gears-Plugin vom Gears-Loader ausgeführt wird, um das Fensterobjekt festzulegen und dieses als Site-Schnittstelle anstelle des von IE Mobile im SetSite-Aufruf bereitgestellten IUnknown zu verwenden.Bezüglich des Gears-Codes sind sich die Google-Ingenieure des gleichen Problems bewusst, das ich frage, und haben die von mir beschriebene Problemumgehung entwickelt.

Allerdings glaube ich, dass es eine andere, „offiziellere“ Möglichkeit geben muss, mit diesem Problem umzugehen, da die explizite Festlegung der Site auf einem ActiveX-Steuerelement/Plugin nicht besonders gut ist.Ich werde jetzt direkt das MS IE Mobile-Team fragen und Sie auf dem Laufenden halten, sobald ich eine Lösung habe.Es könnte sich um einen Fehler in IE Mobile handeln, was mir am wahrscheinlichsten ist, aber wer weiß ...

Aber trotzdem danke für deine Antwort ;))

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top