获得ActiveX控件所在网页的对象模型

chinaunix
基本上翻译自以下两文
http://support.microsoft.com/kb/172763/EN-US/#appliesto
http://support.microsoft.com/kb/181678

一. 获得所在IE页面的URL
  1. 获得IOleClientSite接口指针
  2. 调用IOleClientSite::GetMoniker()获得client site的moniker对象指针
  3. 调用IMoniker::GetDisplayName()获得当前文档的URL
下面是ATL中获得URL的例程,这里是在SetClientSite中获得,可以在其它任何时候获得。
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
{
   if (pClientSite != NULL)
   {
      // Obtain URL from container moniker.
      CComPtr<IMoniker> spmk;
      LPOLESTR pszDisplayName;

      if (SUCCEEDED(pClientSite->GetMoniker(
                                    OLEGETMONIKER_TEMPFORUSER,
                                    OLEWHICHMK_CONTAINER,
                                    &spmk)))
      {
         if (SUCCEEDED(spmk->GetDisplayName(
                                 NULL, NULL, &pszDisplayName)))
         {
            USES_CONVERSION;

            CComBSTR bstrURL;
            bstrURL = pszDisplayName;

            ATLTRACE("The current URL is %s\n", OLE2T(bstrURL));
            CoTaskMemFree((LPVOID)pszDisplayName);
         }
      }
   }

   return IOleObject_SetClientSite(pClientSite);
}

在MFC中,可以重载COleControl::OnSetClientSite在设置ClientSite时就获得URL:

void CMyCtrl::OnSetClientSite() {    LPOLECLIENTSITE pClientSite = GetClientSite();    ......//其它同上。}

二.   访问所在文档的对象模型,即document,element等
1.   获得IWebBrowserApp,使用

a.使用IOleClientSite接口获得IServiceProvider接口:

CComQIPtr pISP;
pClientSite->QueryInterface(IID_IServiceProvider, (void **)&pISP);

b.使用IServiceProvider接口获得IWebBrowserApp接口:

pISP->QueryService(SID_SWebBrowserApp, IID_IWebBrowserApp,   (void **)&pIWebBrowserApp));

对于IE4或以后版本,也可以获得IWebBrowserApp2接口:

pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2,  (void **)&pIWebBrowser2));

2.  使用IWebBrowserApp获得文档(document)对象,接着是其它对象。

ActiveX 对象模型

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部