Question

J'ai écrit un plugin Active X pour IE7 qui implémente IObjectWithSite en plus de certains autres interfaces (note n IOleClient).Cette interface est interrogé par IE7.Au cours de la SetSite (), appelez-je récupérer un pointeur vers IE7 de l'interface du site que je peux utiliser pour récupérer l'interface IHTMLDocument2 à l'aide de l'approche suivante:

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

J'ai essayé une approche similaire sur la TARTE en utilisant le code suivant, cependant, même le IPIEHTMLWindow2 interface ne peut pas être acquis, donc je suis coincé:

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

À l'aide de l'interface IServiceProvider cela ne fonctionne pas, donc je l'ai déjà testé cette.

Des idées?

Était-ce utile?

La solution

J'ai trouvé le code suivant dans le Google Gears code, ici.J'ai copié les fonctions, je pense que vous avez besoin ici.Celui dont vous avez besoin est en bas (GetHtmlWindow2), mais les deux autres sont nécessaires.Heureusement que je n'ai pas manqué de rien, mais si j'ai fait le truc que vous avez besoin est probablement sur le lien.

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

Autres conseils

Eh bien, j'étais au courant des engins de code déjà.Le mécanisme d'engrenages utilise est basée sur une solution de contournement par le biais de l'exécution d'une méthode explicite d'appel dans les roues plugin de les engrenages chargeur pour définir la fenêtre de l'objet et de l'utiliser comme interface du site au lieu de l'interface IUnknown fournis par IE Mobile dans le SetSite appel.Quant aux engins de code Google ingénieurs sont conscients de le même problème, je vais lui demander et est venu avec cette solution de contournement que j'ai décrit.

Cependant, je crois qu'il doit y avoir un autre plus "officiel" de la façon de traiter ce problème depuis explicitement la configuration du site sur un contrôle Active X/plugin n'est pas très grande.Je vais demander à la MS IE équipe Mobile directement maintenant et vous tiendrons au courant dès que j'arrive à une solution.Il peut-être un bug dans IE Mobile qui est le plus susceptible chose que je peux imaginer, mais qui sait...

Mais merci de toute façon pour votre réponse ;))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top