2008-09-05 5 views
2

Я написал Active X-плагин для IE7, который реализует IObjectWithSite, помимо некоторых других необходимых интерфейсов (обратите внимание на IOleClient). Этот интерфейс запрашивается и вызывается IE7. Во время SetSite() вызов я получить указатель на интерфейс сайта IE7, который я могу использовать, чтобы получить интерфейс IHTMLDocument2 используя следующий подход:Как получить интерфейс IPIEHTMLDocument2 на IE Mobile

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

Использование интерфейса 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

Ну, я уже знал о коде передач. Механизм механизма используется на основе обходного пути путем выполнения явного вызова метода в плагин gears из загрузчика передач для установки объекта окна и использования его в качестве интерфейса сайта вместо IUnknown, предоставленного IE Mobile в вызове SetSite. Что касается кода передач, инженеры Google знают о той же проблеме, о которой я прошу, и придумали обходное решение, которое я описал.

Тем не менее, я считаю, что должен быть еще один «официальный» способ решения этой проблемы, поскольку прямое задание сайта на Active X control/plugin не очень велико. Я собираюсь спросить команду MS IE Mobile прямо сейчас и будет информировать вас, как только я получу решение. Это может быть ошибка в IE Mobile, которая, скорее всего, я могу себе представить, но кто знает ...

Но спасибо в любом случае за ваш ответ;))

 Смежные вопросы

  • Нет связанных вопросов^_^