• ActiveX获取脚本对象


    编写IE的ActiveX时,总希望能够获取IE中的脚本对象,从而便于在ActiveX中进行脚本处理。

    1、网上流传了很广泛的一种方法,就是通过顶层的方式来获取脚本(JavaScript)对象,这种方式在获取顶层脚本非常好,但是不足的是在iframe框架中,iframe内部的JavaScript是不能够被准确获取的。下面是示例代码:

     1 IServiceProvider *isp, *isp2 = NULL;
     2 
     3          do{
     4             HRESULT hr = S_OK;
     5             
     6             m_pClientSite->AddRef();
     7             hr = m_pClientSite->QueryInterface( IID_IServiceProvider, reinterpret_cast<void **>(&isp) );
     8             m_pClientSite->Release();
     9             
    10             if (FAILED(hr)) 
    11             {
    12                 break ;
    13             }
    14             
    15             isp->AddRef();
    16             hr = isp->QueryService( SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2) );
    17             isp->Release();
    18             
    19             if (FAILED(hr))
    20             {
    21                 break ;
    22             }
    23             
    24             isp2->AddRef();
    25             hr = isp2->QueryService( SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&pWebBrowser) );
    26             isp2->Release();
    27             
    28             isp->Release();
    29             
    30             if (FAILED(hr)) 
    31             {
    32                 break ;
    33             }
    34             
    35             
    36             pWebBrowser->AddRef();
    37             hr = pWebBrowser->get_Document( (IDispatch**)&pHTMLDocument );
    38             pWebBrowser->Release();
    39             
    40             isp2->Release();
    41             
    42             if(FAILED(hr))
    43             {
    44                 break ;
    45             }
    46             
    47             pHTMLDocument->AddRef();
    48             hr = pHTMLDocument->get_Script(&pScript);
    49             pHTMLDocument->Release();
    50             
    51             pWebBrowser->Release();
    52             
    53             
    54             if(FAILED(hr))
    55             {
    56                 break ;
    57             }
    58             
    59     }while(FALSE);

    先查询服务接口,然后再通过服务接口查询顶层浏览器的服务提供者,再由这个服务器提供者查询浏览器,从浏览器中获取Document对象,然后再获取到JavaScript对象。方法比较繁琐,但总体含义还算比较清晰。


    2、如果想要获取iframe框架中的JavaScript对象,那么需要采用另外的方式进行获取,代码很简单,关键是对于IE的COM接口是否熟悉。
    1 CComPtr<IOleContainer> spContainer;
    2 HRESULT hr = m_pClientSite->GetContainer(&spContainer);
    3 if ( hr == S_OK )
    4 {
    5     CComQIPtr<IHTMLDocument2> spDoc = spContainer;
    6     spDoc->get_Script(&pScript);
    7     theApp.pScript = pScript;
    8 }
    也比较容易理解,先获取容器对象,也就是所谓的IHTMLDocument2对象,然后从该对象中获取脚本对象。

    后记:
         不知道还有没有其他方式获取IE脚本对象?

  • 相关阅读:
    Python 对数组元素操作的三种方法
    多任务学习Multitask Learning概述zz
    10个梯度下降优化算法+备忘单
    你应该知道的LightGBM各种操作!
    一文详解Softmax函数zz
    paddle中的LoDTensor
    linux 【监控io】iotop命令详解 规格严格
    [web部署] supervisor日志配置为服务 规格严格
    PostgreSQL安装完成后,参数调整 规格严格
    pg性能优化 规格严格
  • 原文地址:https://www.cnblogs.com/ubunoon/p/1527476.html
Copyright © 2020-2023  润新知