zoukankan      html  css  js  c++  java
  • 如何调用ActiveX网页中的JavaScript函数

    前言

      在HTML的页面中放置一个COM对象,这个对象该如何调用页面中的脚本函数的问题。

      1——
    给接口添加一个方法:
    方法名:SetClientSite
    参数:IOleClientSite* pClientSite

      2——
    给上面的方法加以实现(在相应的类中实现,已经自动生成了框架):
    STDMETHODIMP CIrDav::SetClientSite(IOleClientSite * pClientSite)
    {
    // TODO: 在此添加实现代码
    HRESULT hr = S_OK;
    IServiceProvider *isp, *isp2 = NULL;
    if (!pClientSite)
    {
    COMRELEASE(m_spBrowser);

    else
    {
    try
    {

         hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>  (&isp));
    if (FAILED(hr))
    throw("");
    hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider,     reinterpret_cast<void **>(&isp2));
    if (FAILED(hr))
    throw("");
    hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2,     reinterpret_cast<void **>(&m_spBrowser));
    if (FAILED(hr))
    throw("");
    hr=this->m_spBrowser->get_Document((IDispatch**)&m_spDoc);
    if(FAILED(hr))
    throw("");
    }
    catch(LPCTSTR lpszErr)
    {
    if(CString(lpszErr)!="")
    MessageBox(lpszErr);
    hr=S_OK;
    }
    catch(...)
    {
    MessageBox("未知错误");
    hr=S_OK;
    }
    COMRELEASE(isp);
    COMRELEASE(isp2);
    }
    return hr;
    }

    通过这步的操作,我们就获得了控件所在Web页面的BROWSER对象指针和相应的DOCUMENT对象指针。

      通过这些BROWSER和DOCUMENT对象指针,我们可以设置窗口的很多属性,比如菜单、全屏、工具栏等的显示和DOCUMENT的背景颜色等等。
    这个方法参见MSDN:http://support.microsoft.com/support/kb/articles/Q257/7/17.ASP

      3——
    获得脚本,通过m_spDoc(DOCUMENT对象)的方法get_Script可以获得页面中的脚本对象:
    CComPtr<IDispatch> pScript;
    hr=this->m_spDoc->get_Script(&pScript);

      4——
    检索函数,使用上面脚本对象的GetIDsOfNames可以获取页面之中指定名的脚本函数的指针:
    CComBSTR bstrMember("calert");
    DISPID dispid;
    hr=pScript->GetIDsOfNames    (IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);

      5——
    调用脚本对象的Invoke方法执行脚本函数:
    DISPPARAMS dispparams;
    memset(&dispparams, 0, sizeof dispparams);
    dispparams.cArgs = 2;
    dispparams.rgvarg = new VARIANT[dispparams.cArgs];

    for( int i = 0; i < 2; i++)
    {
    CComBSTR bstr = "111"; // back reading
    bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
    dispparams.rgvarg[i].vt = VT_BSTR;
    }

      dispparams.cNamedArgs = 0;
    EXCEPINFO excepInfo;
    memset(&excepInfo, 0, sizeof excepInfo);
    CComVariant vaResult;
    UINT nArgErr = (UINT)-1;  // initialize to invalid arg
    hr = pScript->Invoke  (dispid,IID_NULL,0,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);

      这里的执行中我随意的写了几个参数,可以根据自己需要修改。
    本示例的触发:打开相应的HTM页面,点击发送按钮,按钮调用脚本函数btn,btn调用了COM中的函数KeyPress函数,在KeyPress函数中获取calert函数并调用。

      注:一个问题:
    获得BROWSER对象是在SetClientSite函数中实现,这个函数我了解不多,我想应该是系统自动运行的函数之一,但当我使用这个函数后,原先 我在COM中定义的事件(比如CLICK事件)不能响应。有高手介绍说放置在别的地方,我想应该是可以的,比如找一个COM就绪的函数进行处理,但不知 IOleClientSite*pClientSite又该如何获得。


    本工程是用.NET2003弄的,可能你们系统不支持,不过没有关系,重要建立自己的COM工程后,把IrDav的相关文件包含添加到工程就可以了。

  • 相关阅读:
    Linq To Object
    笔试算法
    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线
    vue3.0中setup的参数
    力扣算法题
    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组
    vif 与 vfor优先级
    给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 /返回这三个数的和。
    /给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[
    vue3+canvas随机生成4位验证码
  • 原文地址:https://www.cnblogs.com/zdxster/p/1945869.html
Copyright © 2011-2022 走看看