問題:
在使用Active Accessibility SDK的過程中,我從某個(gè)窗口的句柄來獲得IHTMLDocument2指針。有沒有什么方法可以從IHTMLDocument2指針來獲得IWebBrowser2指針?我用QueryInterface在兩個(gè)接口(IHTMLDocument2 和 IWebBrowser2)上試過,但沒有成功。我也用網(wǎng)景(Netscape)的 HTMLWindow2 指針試過從get_navigator獲取IOmNavigator *。也以失敗告終。請(qǐng)高手指點(diǎn)。
解答:
這個(gè)問題通常是COM編程中存在的共性問題。你有了窗口,文檔,或者瀏覽器,你明明知道可以通過這些已知數(shù)據(jù)來得到其它的信息,但往往在實(shí)際環(huán)境中一運(yùn)行,QueryInterface總是給你送回一個(gè)肥大的NULL。這個(gè)問題的答案實(shí)際上隱藏在神秘的IServiceProvider接口中,顧名思義,IServiceProvider的作用就是提供服務(wù)。IServiceProvider是個(gè)非常棒的接口:它只有一個(gè)方法——QueryService。如果你會(huì)用ATL智能指針,就像下面這樣。首先必須獲得IServiceProvider接口,
CComQIPtr isp = pIHTMLDocument2;
這行代碼實(shí)際上就是對(duì)文檔執(zhí)行了一次 QueryInterface,以詢問IServiceProvider接口。一旦具備了isp,你便可以象下面這樣獲得瀏覽器。
CComQIPtr iwb2;
isp->QueryService(IID_IWebBrowserApp,IID_IWebBrowser2, (void**)&iwb2);
如果你還是不明白上面所講東西,沒有關(guān)系,很正常。COM編程的一個(gè)根本規(guī)則是:QueryInterface必須總是要返回所查詢對(duì)象的接口。但是文檔不實(shí)現(xiàn) IWebBrowser2

圖一 多個(gè)對(duì)象,一個(gè)IServiceProvider
從本質(zhì)上講,IServiceProvider用于導(dǎo)航DHTML對(duì)象層次。假設(shè)你正在寫一個(gè)ActiveX控件來導(dǎo)航這個(gè)對(duì)象模型。你如何做呢?首先要像下面這樣查詢IOleClientSite來取得IServiceProvider:
CComQIPtr isp = pSite;
然后,一旦你具備了IServiceProvider,則可以用QueryService來從中查詢應(yīng)用對(duì)象。
CComQIPtr iwba;
isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba);
接下來你就可以導(dǎo)航這個(gè)對(duì)象層次了(應(yīng)用對(duì)象在最頂層)。如果你想要得到Web瀏覽器,那么與前面類似。
CComQIPtr iwb2;
isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&iwb2));
在所有這些例子中,SID_SWebBrowserApp都是服務(wù)標(biāo)示,但你也能常常見到將IID_IWebBrowserApp作為服務(wù)ID的代碼。兩種用法都可以行得通,因?yàn)槲募杏袀€(gè)宏定義:
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選