ActiveX调用 js脚本方法

Q:
ActiveX中如何调用Script函数?如何访问Document,Browser,浏览器地址,Cookie...

A:
在ATL写的ActiveX中,重载IOleObject::SetClientSite()方法。
http://support.microsoft.com/kb/181678/en-us
在MFC写的ActiveX中,重载COleObject::OnSetClientSite()方法。
http://support.microsoft.com/kb/153582/en-us

参阅:
针对webbrowser和IE编程
http://blog.csdn.net/shanhe/category/15859.aspx
获取Cookie
http://www.codeproject.com/com/firingeventsamongactivex.asp

// 调用网页中的javascipt:window.close()函数
void CMyCtrl::OnSetClientSite() {
  try {
    LPOLECLIENTSITE pClientSite = GetClientSite();
    if(pClientSite == NULL) return;
    IServiceProvider *isp = NULL;
    HRESULT hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp));
    if (FAILED(hr)) return;
    IServiceProvider *isp2 = NULL;
    hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
    isp->Release();
    if (FAILED(hr)) return;
    IWebBrowser2* browser = NULL;
    hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&browser));
    isp2->Release();
    if (FAILED(hr)) return;
    IHTMLDocument* doc = NULL;
    hr=browser->get_Document((IDispatch**)&doc);
    browser->Release();
    if(FAILED(hr)) return;
    IDispatch* script = NULL;
    hr=doc->get_Script(&script);
    doc->Release();
    if(FAILED(hr)) return;

    OLECHAR FAR* sClose = L"close";
    DISPID dispid;
    hr=script->GetIDsOfNames(IID_NULL,&sClose,1,LOCALE_SYSTEM_DEFAULT,&dispid);
    if(FAILED(hr)) return;
    DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};
    script->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&dpNoArgs,NULL,NULL,NULL);
    script->Release();
  } catch(...) {
  }
}

// 访问浏览器地址
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite) {
  if (pClientSite != NULL) {
    CComPtr<IMoniker> spmk;
    LPOLESTR pszDisplayName;
    HRESULT hr = pClientSite->GetMoniker(OLEGETMONIKER_TEMPFORUSER,OLEWHICHMK_CONTAINER,&spmk);
    if (SUCCEEDED(hr)) {
      hr = spmk->GetDisplayName(NULL, NULL, &pszDisplayName);
      if (SUCCEEDED(hr)) {
        USES_CONVERSION;
        CComBSTR bstrURL;
        bstrURL = pszDisplayName;
        ATLTRACE("The current URL is %s/n", OLE2T(bstrURL));
        CoTaskMemFree((LPVOID)pszDisplayName);
      }
    }
  }
  return IOleObject_SetClientSite(pClientSite);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值