`

Java实现与IE的交互

阅读更多
需求
遍历当前打开的IE实例,分别获取IE浏览器中打开文档的一个节点值,调用IE内容中的一个javascript函数。

分析
Java直接控制IE浏览器,有点麻烦。只有通过VC来实现,生成一个dll文件,Java通过JNI调用。

实现

1、准备工作:该工程采用的原理是通过和IE对象的接口的交互来实现对IE的访问,实际上是采用COM的技术。所以需要在vc工程中加入对COM的支持:

#import <shdocvw.dll>
#import <mshtml.tlb> // Internet Explorer 5
#include <atlbase.h>
CComModule _Module;// 由于要使用 CComDispatchDriver ATL的智能指针,
		// 所以声明它是必须的

#include <mshtml.h>		// 所有 IHTMLxxxx 的接口声明
#include <atlcom.h>

2、用VC实现对当前IE实例的进行遍历的方法,通过ShellWindows集合来代表属于shell的当前打开的窗口的集合,而IE就是属于shell的一个应用程序。

CoInitialize(NULL);//初始化COM
CComPtr< IShellWindows > spShellWin;
HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
if ( FAILED ( hr ) )
{
       return;
}

long nCount = 0;		
spShellWin->get_Count( &nCount );// 取得浏览器实例个Explorer 
//和 IExplorer)
if( 0 == nCount )
{
	return;
}

for(int i=0; i<nCount; i++)
{
	CComPtr< IDispatch > spDispIE;
	hr=spShellWin->Item(CComVariant( (long)i ), &spDispIE );
	if ( FAILED ( hr ) )	continue;

	CComQIPtr< IWebBrowser2 > spBrowser = spDispIE;
	if ( !spBrowser )		continue;

	CComPtr < IDispatch > spDispDoc;
	hr = spBrowser->get_Document( &spDispDoc );//判断实例
                                                     //对象是不是属于IE浏览器对象

	if ( FAILED ( hr ) )	continue;
         ComQIPtr< IHTMLDocument2 > spDocument2 = spDispDoc;
	if ( !spDocument2 )		continue;
	// 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
	}
CoUninitialize();//release COM


3、获取IE浏览器中打开文档的一个节点值

HRESULT hr;
CComBSTR bstrTitle;
CComPtr<IHTMLElementCollection> pElementCol;
VARIANT id, index;
CComPtr<IHTMLElement> pElement;
pIHTMLDocument2->get_title( &bstrTitle );	//取得文档标题
if (SUCCEEDED(pIHTMLDocument2->get_all(&pElementCol)))
{
	long p=0;
	if(SUCCEEDED(pElementCol->get_length(&p)))
	if(p!=0)
	{   
		// AfxMessageBox("1");
		for(long i=0;i<=(p-1);i++)
		{
			
			V_VT(&id) = VT_I4;
			V_I4(&id) = i;
			V_VT(&index) = VT_I4;
			V_I4(&index) = 0;
				
			if(SUCCEEDED(pElementCol->item(id,index, &spDispatch)))
			{
					
			     if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
			     {
					CComBSTR value;
					CComBSTR type;  
					pElement->get_outerText(&value);
					pElement->get_tagName(&type);
					CString   str(value); 
					CString   str2(type); 
					if(str == "百度一下,你就知道")
							AfxMessageBox(str);
					if(str2 == "BROWERID")
							AfxMessageBox(str2);
				}
			}
		}
	}
}

4、调用IE内容中的一个javascript函数

HRESULT   ExecJavascript(CString   strJsFunctionName_In,   const   CArray <VARIANT,   VARIANT&>   &pArrVARIANT_Params) 
{ 
//前提是你已经取得了IHTMLDocument2 
CComPtr <IDispatch>   pScript; 

hResult   =   m_IHTMLDocument2-> get_Script(&pScript); 
if(FAILED(hResult)) 
{ 
return   FALSE; 
} CComBSTR   pCComBSTR(strJsFunctionName_In); 
DISPID   pDISPID; 
hResult   =   pScript-> GetIDsOfNames(IID_NULL,   &pCComBSTR,   1,   LOCALE_SYSTEM_DEFAULT,   &pDISPID); 
if(FAILED(hResult)) 
{ 
return   FALSE; 
}

//(3)Add   Parameters 
DISPPARAMS   pDISPPARAMS; 
memset(&pDISPPARAMS,   0,   sizeof(pDISPPARAMS)); 

int   intArgsCount_In   =   pArrVARIANT_Params.GetSize(); 
VARIANT*   vParams   =   new   VARIANT[intArgsCount_In]; 

for(   int   i   =   0;   i   <   intArgsCount_In;   i++) 
{ 
vParams[i]   =   pArrVARIANT_Params.GetAt(i);   
} 

//Params   Count 
pDISPPARAMS.cArgs   =   intArgsCount_In; 
//Params   Array 
        pDISPPARAMS.rgvarg   =   vParams; 
//Name   Args   Count 
    pDISPPARAMS.cNamedArgs   =   0; 
//(4)Invoke   Javascript   Method 
EXCEPINFO   pEXCEPINFO; 
memset(&pEXCEPINFO,   0,   sizeof(pEXCEPINFO)); 

CComVariant   pCComVariant; 

//Initialize   to   invalid   arg 
UINT   nintArgErr   =   (UINT)-1;     

hResult   =   pScript-> Invoke 
(pDISPID,   IID_NULL,   0,   DISPATCH_METHOD,   &pDISPPARAMS,   &pCComVariant,   &pEXCEPINFO,   &nintArgErr); 

delete[]   pDISPPARAMS.rgvarg; 
pScript.Release(); 

if(FAILED(hResult)) 
{ 
return   FALSE; 
} 

return   TRUE; 
} 


5、编译生成dll文件,供Java通过JNI调用

注意事项
1、可能Java通过JNI调用的时候,会报异常,可能是因为没有释放一些资源包括IDispatch、IHTMLElementCollection、IHTMLElement等。c++不会像java那样垃圾自动回收,需要手动释放。
2、首先需要调用CoInitialize(NULL),因为在调用任何COM函数之前,需要一个线程去调用CoInitialize(NULL)来加载COM组件,这样就可以自由地调用COM的,不过不要忘记CoUninitialize()哦!
分享到:
评论

相关推荐

    java与html交互

    本文将详细介绍如何利用JavaScript与Java Applet之间的交互来获取用户在Internet Explorer(IE)浏览器中的IP地址。 #### Java Applet简介 Java Applet是一种小型的Java应用程序,可以在网页上运行,由Java编写的...

    java操作IE代理

    在这个场景中,DLL文件可能是用于直接与Windows API交互,更改IE代理设置的本地代码实现。将它放在"jdk/bin"目录下,是因为这是Java默认寻找本地库的路径之一,使得Java程序能够找到并加载这个库。 实现Java操作IE...

    java浏览器调用ie内核

    总结来说,Java调用IE内核主要涉及Java与ActiveX控件的交互,这一技术虽然有一定的历史背景,但在现代Web开发中已经较少使用,更多的现代解决方案倾向于使用标准Web技术或者基于Chromium的框架。理解和学习这个知识...

    java调用IE浏览器

    首先,`java.lang.Runtime`类是Java平台的标准API,它可以提供与操作系统交互的能力。调用浏览器的一个基本方法是通过`Runtime.exec()`方法执行系统命令。例如,如果要打开IE浏览器并加载特定的URL,可以这样做: `...

    java做的IE浏览器.rar

    3. **网络编程**:Java的`java.net`包提供了进行网络通信的基础,包括HTTP协议的实现,这对于浏览器来说至关重要,因为它需要通过HTTP或HTTPS协议与Web服务器交互,获取和发送数据。 4. **HTML和JavaScript解析**:...

    java基于IE内核网页浏览器

    - **JNI (Java Native Interface)**: 由于Java本身并不直接支持IE内核,开发者可能使用JNI来调用C++或C代码,这些代码可以与IE的ActiveX控件交互,从而在Java应用中嵌入IE的网页渲染能力。 - **Webkit or ...

    MINI-IE.rar_java与ie

    标题“MINI-IE.rar_java与ie”暗示我们讨论的主题是关于一个小型的浏览器实现,它可能基于Java技术并与Internet Explorer(IE)有关。描述提到这个小型浏览器用于实现服务器与客户端之间的通信,这通常涉及网络编程...

    java在IE中下载证书并安装(根证书)

    Java在IE中下载并安装根证书是一个常见的网络安全配置步骤,主要应用于验证服务器的身份,确保数据传输的安全性。在这个过程中,根证书(Root Agency.cer)是信任链的基础,它代表了一个权威的证书颁发机构(CA),...

    漂亮的java嵌套浏览器IE,chrome

    描述中提到"内嵌浏览器,java实现,Chrome和IE,功能强大可以直接使用",这表明该库已经实现了与这两个浏览器引擎的接口,开发者可以方便地将其集成到自己的Java项目中,而无需关心底层复杂的浏览器渲染和交互逻辑。...

    如何在JAVA程序中嵌入IE

    在Java程序中嵌入Internet Explorer(IE)是一种常见的需求,特别是在需要在应用程序内部展示网页内容或者与Web服务交互时。...通过这些步骤,开发者可以创建一个包含内嵌IE浏览器的Java应用程序,实现与Web的交互。

    java实现word在线编辑及流转

    3. **兼容性**: PageOffice组件兼容各种主流浏览器,如Chrome、Firefox、IE等,同时也支持多种Java应用服务器,如Tomcat、WebLogic、Jboss等。这意味着开发者可以在各种环境下灵活部署和使用。 4. **API与接口**: ...

    JAVA仿IE浏览器源码

    【JAVA仿IE浏览器源码】项目是一个基于Java技术实现的简单网络浏览器,旨在为开发者提供一个基础框架,以便于在该基础上进行二次开发和功能扩展。这个项目充分展示了Java语言在构建桌面应用上的能力,尤其是GUI...

    配置Selenium工具(Java IE)

    此外,IE浏览器必须设置为默认浏览器,因为Selenium可能无法与非默认浏览器正确交互。 总结来说,配置Selenium(Java IE)涉及以下几个步骤:安装JDK,下载并配置IEDriverServer,设置系统环境变量,导入Selenium库...

    java版本仿IE下载

    Java版本的仿IE下载是一种利用Java技术实现的网络下载工具,它模仿了Internet Explorer浏览器的下载功能,提供了用户友好的图形界面。这个项目基于J2EE(Java 2 Enterprise Edition)框架,使得它具备了服务器端处理...

    ie.rar_IE_java ie

    结合“ie java_ie”的标签,我们可以推测这个项目可能是用Java语言来实现的,并且与IE浏览器有某种交互。Java是一种跨平台的编程语言,非常适合开发桌面应用程序,包括浏览器模拟器。可能开发者利用Java的Swing或...

    Java通过注册表获取IE代理设置(附源码)

    Java并不直接支持对注册表的操作,但我们可以借助于第三方库,如JNA(Java Native Access)或者JReg,它们提供了与操作系统底层交互的能力。 1. 使用JNA: JNA允许Java代码直接调用操作系统API,包括访问注册表。...

    flash和jsp,flash和java交互的web project

    本项目“Flash和jsp,Flash和Java交互的web project”旨在演示和实现这些技术间的协同工作,为用户提供更丰富的交互体验。 Flash是一种由Adobe公司开发的多媒体创作工具,它用于创建动画、图形、视频以及交互式内容...

    Cell插件IE&JAVA开发示例

    总的来说,"Cell插件IE&JAVA开发示例"这个主题涵盖了一系列技术,包括了浏览器插件开发、Java客户端编程、Web表格应用设计以及与服务器的通信。对于希望提升Web应用功能或者维护旧有系统的开发者来说,这是一个非常...

    用JAVA实现博客系统的设计.pdf

    ### 用JAVA实现博客系统的设计 #### 概述 随着Web技术的发展以及用户对网络服务需求的提升,基于JAVA开发的博客系统成为了满足用户个性化需求的重要工具。本文旨在通过介绍如何利用JAVA语言来构建一个博客系统,...

Global site tag (gtag.js) - Google Analytics