代码改变世界

ActiveX获取脚本对象

2009-07-21 09:15  ubunoon  阅读(472)  评论(0编辑  收藏  举报
编写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脚本对象?