2008-09-05 1 views
2

다른 필수 인터페이스 (IOleClient는 사용하지 않음) 외에도 IObjectWithSite를 구현하는 IE7 용 Active X 플러그인을 작성했습니다. 이 인터페이스는 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)이지만 나머지 두 개 또한 필요합니다. 다행스럽게도 나는 아무것도 놓치지 않았다. 그러나 내가 원한다면 당신이 필요로하는 것은 아마도 링크에있다.

#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 컨트롤/플러그인에서 명시 적으로 사이트를 설정하는 것이 그리 좋지 않기 때문에이 문제를 다루는 또 다른 "공식적인"방법이 있어야한다고 생각합니다. 지금 MS IE 모바일 팀에 직접 물어보고 해결책을 얻으면 알려줄 것입니다. 그것은 내가 상상할 수있는 가장 가능성있는 일이지만 IE Mobile의 버그 일 수 있습니다. 그러나 누가 알겠습니까 ...

그래도 고마워요.))

관련 문제