2008-09-05 9 views
2

IE7用のActive Xプラグインを作成しました。これは他のいくつかの必要なインターフェイス(IOleClientはありません)に加えてIObjectWithSiteを実装しています。このインターフェイスは、IE7によって照会および呼び出されます。IE Mobile上でIPIEHTMLDocument2インターフェイスを取得するには

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に似たアプローチを試してみました:SetSite()私は、次のアプローチを使用してIHTMLDocument2インターフェイスを取得するために使用することができますIE7のサイトインターフェイスへのポインタを取得し、通話中にでも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 */ 
} 

のいずれかに動作しませんIServiceProviderインターフェイスを使用するので、私はすでにこれをテストしました。

アイデア?

答えて

3

Google Gearsのコードhereに次のコードが見つかりました。あなたが必要と思う機能をここにコピーしました。必要なものは一番下(GetHtmlWindow2)ですが、他の2つも必要です。うまくいけば私は何も見逃しませんでしたが、もし私があなたが必要とするものはおそらくリンクにあります。

#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

よく歯車のコードを知っていました。メカニズムのギアの使用は、SetSite呼び出しでIE Mobileが提供するIUnknownではなく、ウィンドウオブジェクトを設定してサイトインターフェイスとして使用するためにギアローダーからギアのプラグインに明示的なメソッド呼び出しを実行することによる回避策に基づいています。歯車のコードに関して、Googleエンジニアは私が求めているのと同じ問題を認識しており、私が説明したこの回避策を思いついた。

しかし、Active Xコントロール/プラグインで明示的にサイトを設定することはそれほど大きなものではないので、この問題に対処するもう1つの "公式の"方法が必要だと思います。私は今すぐMS IE Mobileチームに尋ねるつもりで、解決策が得られれば、あなたに知らせていきます。それは...私は想像することができる可能性が高いものですが、誰もが知っているIEモバイルのバグかもしれない

しかし、おかげでとにかくあなたの応答のための;))

関連する問題