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);
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 }
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脚本对象?