`
ppg
  • 浏览: 16003 次
  • 来自: 上海
社区版块
存档分类
最新评论

java 用swt调用com组建之ie组建加强版

 
阅读更多
首先因为是调用ie的组建,所以有些机器默认的不是ie,就可能无法直接获取。所以有两点需要做的,1是设置ie为默认浏览器,2是先开一下ie。
先说一下,这个代码是通过进程调用,也可以理解为java进程和ie进程之间的通信。
另外,一些代码也是学习重用了网上的一些代码,但还是做了一些修改。
最后的效果是,打开一个自己预先写的网页,3秒钟之后会自动点击网页上的一个按钮,将html预先的值写入一个textarea中,然后java端获取这个值。
然后是代码部分
1,和之前一样,有一个超类SuperOcx.java
package outIE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleListener;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Composite;
public class SuperOcx extends Composite {
	protected OleAutomation player;
	protected OleControlSite controlSite;
	protected int Type;
	/**
	 * @param parent
	 * @param style
	 */
	public SuperOcx(Composite parent, int style) {
		super(parent, style);
	}

	protected int getType() {
		return Type;
	}

	protected void setType(int type) {
		Type = type;
	}

	public int getID(String name) {
		try {
			int[] ids = player.getIDsOfNames(new String[] { name });
			if (ids.length >= 0)
				return ids[0];
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return -1;
	}
	public int[] getIDs(String... name) {
		try {
			int[] ids = player.getIDsOfNames(name);
			if (ids.length >= 0)
				return ids;
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return null;
	}
	public Variant execute(String methodName) {
		int mid = getID(methodName);
		if (mid < 0)
			return null;

		Variant rtnv = player.invoke(mid);
		return rtnv;
	}
	public Variant getProperty(String parameter){
		int mid = getID(parameter);
		if(mid<0)return null;
		return player.getProperty(mid);
	}
	public Variant execute(String methodName, Variant[] parameter) {
		int mid = getID(methodName);
		if (mid < 0)
			return null;

		Variant rtnv = player.invoke(mid, parameter);
		return rtnv;
	}

	public Variant executes(String[] methodName, Variant[] parameter) {
		int[] mid = getIDs(methodName);
		if (mid == null)
			return null;
		int[] x = new int[1];
		x[0] = mid[1];
		Variant rtnv = player.invoke(mid[0], parameter, x);
		return rtnv;
	}

	/**
	 * 添加事件监听
	 * 
	 * @param eventID
	 * @param listener
	 */
	public void addEventListener(int eventID, OleListener listener) {
		controlSite.addEventListener(eventID, listener);
	}

	/**
	 * 移除事件监听
	 * 
	 * @param eventID
	 * @param listener
	 */
	public void removeEventListener(int eventID, OleListener listener) {

		controlSite.removeEventListener(eventID, listener);
	}
}


2,然后是外部调用ie的方式的封装,这里面的main方法可以试一下,是启动ie进程
AutomationClientSite.java
package outIE;

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.internal.ole.win32.COM;
import org.eclipse.swt.internal.ole.win32.GUID;
import org.eclipse.swt.internal.ole.win32.IUnknown;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;

public class AutomationClientSite extends OleClientSite {
	public AutomationClientSite(Composite parent, int style, String progId) {
		super(parent, style);
		try {
			appClsid = getClassID(progId);
			if (appClsid == null)
				OLE.error(OLE.ERROR_INVALID_CLASSID);
			int[] address = new int[1];
			int result = COM.CoCreateInstance(getClassID(progId), 0, COM.CLSCTX_INPROC_SERVER | COM.CLSCTX_LOCAL_SERVER, COM.IIDIUnknown, address);
			if (result != COM.S_OK)
				OLE.error(OLE.ERROR_CANNOT_CREATE_OBJECT, result);
			objIUnknown = new IUnknown(address[0]);
		} catch (SWTException e) {
			dispose();
			disposeCOMInterfaces();
			throw e;
		}
	}

	protected GUID getClassID(String progId) {
		GUID guid = new GUID();
		char[] buffer = null;
		if (progId != null) {
			int count = progId.length();
			buffer = new char[count + 1];
			progId.getChars(0, count, buffer, 0);
		}
		if (COM.CLSIDFromProgID(buffer, guid) != COM.S_OK) {
			int result = COM.CLSIDFromString(buffer, guid);
			if (result != COM.S_OK)
				OLE.error(result);
		}
		return guid;
	}

	public static void main(String[] args) {
		Shell composite = new Shell();
		OleFrame frame = new OleFrame(composite, SWT.NONE);
		AutomationClientSite client = new AutomationClientSite(frame, SWT.NONE, "InternetExplorer.Application");
		OleAutomation ole = new OleAutomation(client);
		int[] ids = ole.getIDsOfNames(new String[] { "visible" });
		ole.setProperty(ids[0], new Variant(true));
	}
}


3,IEFrame.java 这个是对于IE控件的进一步封装
package outIE;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.OleListener;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Composite;
/**
 * IE控制
 * 
 */
public class IEFrame extends SuperOcx {
	public AutomationClientSite automationClientSite;
	/**
	 * session event
	 */
	public static final int OnStatusChanged = 1;//

	/**
	 * Create the composite
	 * 
	 * @param parent
	 * @param style
	 */
	public IEFrame(Composite parent, int style) {
		super(parent, style);
		createContents();
	}

	protected void createContents() {
		setLayout(new FillLayout());
		try {
			OleFrame frame = new OleFrame(this, SWT.NO_TRIM);
			automationClientSite = new AutomationClientSite(frame, SWT.NONE, "InternetExplorer.Application");
			player = new OleAutomation(automationClientSite);
			int[] ids = player.getIDsOfNames(new String[] { "visible" });
			player.setProperty(ids[0], new Variant(true));
		} catch (SWTException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (SWTError e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 跳转网址
	 * @param rgvarg
	 * @param rgdispidNamedArgs
	 * @return
	 */
	public long Navigate(String rgvarg, int rgdispidNamedArgs) {
		Variant v[] = new Variant[2];
		v[0] = new Variant(rgvarg);
		v[1] = new Variant(rgdispidNamedArgs);
		return execute("Navigate", v).getLong();
	}
	/**
	 * 用来获取dom的元素
	 * @param id
	 * @return
	 */
	public OleAutomation getElementById(String id) {
		Variant v[] = new Variant[1];
		v[0] = new Variant(id);
		return execute("getElementById", v).getAutomation();
	}
	@Override
	public void addEventListener(int eventID, OleListener listener) {
		super.addEventListener(eventID, listener);
	}

	@Override
	public void removeEventListener(int eventID, OleListener listener) {
		super.removeEventListener(eventID, listener);
	}
}

4,调用,里面有注释,可以自己看
OutIEPlayer.java
/**
 * 
 */
package outIE;

import org.eclipse.swt.SWT;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Shell;
public class OutIEPlayer {

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
			Shell shell = new Shell(SWT.CLOSE | SWT.MIN);
			IEFrame ieFrame = new IEFrame(shell, SWT.NONE);
			String url =System.getProperty("user.dir") + "\\test.html";
			String[] methodName = new String[] { "Navigate", "URL" };
			Variant[] rgvarg = new Variant[1];
			rgvarg[0] = new Variant(url);
			ieFrame.executes(methodName, rgvarg);
			
			Variant vdoc = ieFrame.getProperty("document");// 获取ie的Document元素
			OleAutomation doc = vdoc.getAutomation();// 转成ole
			Variant vplayer = doc.invoke(doc.getIDsOfNames(new String[] { "getElementById" })[0], new Variant[] { new Variant("play") });
			Thread.sleep(3000);
			// 登录模拟click
			vplayer.getAutomation().invoke(vplayer.getAutomation().getIDsOfNames(new String[] { "click" })[0]);
			//获取listinfo元素
			Variant VtextArea= doc.invoke(doc.getIDsOfNames(new String[] { "getElementById" })[0], new Variant[] { new Variant("listinfo") });
			OleAutomation textArea=VtextArea.getAutomation();
			//获取value属性的id
			int listinfoID = textArea.getIDsOfNames(new String[] { "value" })[0];
			//获取内容
			Variant list=textArea.getProperty(listinfoID);
			System.out.println(": "+list.getString());
	}

}

附件是用eclipse建立的工程,有基础班和加强版两个例子,仅供参考。
分享到:
评论
3 楼 ppg 2013-04-06  
navaa 写道
基础版用controlSite = new OleControlSite(frame, SWT.NO_TRIM, "Shell.Explorer");
而高级版用automationClientSite = new AutomationClientSite(frame, SWT.NONE, "InternetExplorer.Application");

请教一下楼主,有什么办法,即可以支持ie的dom操作,也支持ie的事件监听呢?



不好意思,长时间不用swt了。以前有一种方法是可以将ie内嵌在java里面。这种方式程序是什么都能做,只是应用上有局限性。
2 楼 navaa 2013-03-11  
基础版用controlSite = new OleControlSite(frame, SWT.NO_TRIM, "Shell.Explorer");
而高级版用automationClientSite = new AutomationClientSite(frame, SWT.NONE, "InternetExplorer.Application");

请教一下楼主,有什么办法,即可以支持ie的dom操作,也支持ie的事件监听呢?
1 楼 navaa 2013-03-11  
经测试,貌似基础版本不支持ie的dom文档操作,加强版本不支持ie触发addEventListener操作。

相关推荐

    java 用swt调用com组建之ie组建基础版

    NULL 博文链接:https://ppg.iteye.com/blog/1544120

    java浏览器调用ie内核

    Java 浏览器调用IE内核是一种技术手段,它允许开发者通过Java应用程序来利用Internet Explorer的渲染引擎显示网页内容。这种技术在某些场景下很有用,比如在旧系统的兼容性需求或者特定功能的实现上。以下将详细介绍...

    swt调用ocx应用实例(wps和windows本机播放器)

    本压缩包中的"swt调用ocx应用实例"展示了如何在SWT程序中使用OCX控件来实现特定功能。第一个实例是调用WPS(Kingsoft Office)打开DOC文件。WPS是一款兼容Microsoft Office的办公软件,其OCX控件可以被嵌入到其他...

    SWT调用OCX组件DEMO

    本示例"SWT调用OCX组件DEMO"是关于如何在Java中利用SWT来集成和操作OCX(Object Control eXtension)组件的一个实践。 OCX是Microsoft Windows平台上的控件技术,它基于COM(Component Object Model)模型,允许...

    Java使用SWT JFreeChart控件实现的小游戏.zip

    Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...

    java swt自定义控件

    SWT使用JNI(Java Native Interface)来实现这一目标,它允许Java代码直接调用操作系统提供的API,从而避免了Java AWT和Swing中的“重量级”组件带来的性能问题。 ### 2. 自定义控件的基础 在SWT中,自定义控件通常...

    使用java SWT编写界面的例子,多代码

    Java SWT(Standard Widget Toolkit)是Java编程环境中用于创建桌面应用程序用户界面的一种库,它是Java AWT和Swing之外的一个选择。SWT提供了与操作系统原生界面控件的直接交互,因此,使用SWT编写的程序可以拥有更...

    java SWT教程

    SWT利用JNI(Java Native Interface)调用操作系统内核API,实现了Java应用程序与本地窗口系统的直接交互,从而达到接近原生应用的性能。SWT提供了各种基本的UI组件,如按钮、文本框、列表等。 【JFace简介】 JFace...

    java swt jnilib 库

    在SWT中,JNI库扮演了关键角色,它使得Java代码能够调用操作系统提供的API,以实现与原生UI组件的交互,如窗口、按钮、菜单等。在MacBook M1上,由于硬件架构的变化,需要使用专门为aarch64架构编译的jnilib文件,...

    Java SWT(win32 X86) 开发包

    Java SWT(Standard Widget Toolkit)是Java编程环境中一个用于创建原生图形用户界面(GUI)的开源库,它允许Java开发者构建与操作系统深度融合的应用程序。在Windows 32位(win32 X86)平台上,SWT提供了丰富的控件...

    java socket swt聊天糸统

    Java Socket SWT聊天系统是一个基于...学习这个项目,你可以掌握如何使用Java Socket进行网络通信,如何用SWT创建美观的用户界面,以及如何在服务器和客户端之间同步数据,这对于提升Java全栈开发能力是非常有帮助的。

    SuperMap Objects Java: SWT框架 快速入门

    **SuperMap Objects Java与SWT框架的结合使用** 在IT行业中,SuperMap Objects Java是一款强大的地理信息系统(GIS)开发库,它提供了丰富的GIS功能,帮助开发者构建地理信息应用。而SWT(Standard Widget Toolkit...

    javaSWT简易计算器

    Java SWT(Standard Widget Toolkit)是Java编程环境中用于创建图形用户界面(GUI)的一种库,它是Java AWT和Swing之外的另一种选择。本项目“javaSWT简易计算器”利用SWT来构建一个基本的计算器应用,能够执行基本...

    java-swt

    Java SWT(Standard Widget Toolkit)是Java编程环境中用于创建桌面应用程序的一个库,它是Java AWT(Abstract Window Toolkit)和Swing之外的一个替代选择。SWT设计的目的是提供更原生、性能更高的用户界面组件,...

    Java swt完整教程

    JFace是建立在SWT之上的抽象层,简化了SWT的使用,提供了一些高级组件,如对话框(Dialog)、视图(View)、编辑器(Editor)等。同时,JFace还提供数据绑定、表单构建等功能。 6. SWT与Eclipse RCP Eclipse Rich...

    Java+SWT+图形用户界面教程+PDFJava源码

    Java是世界上最流行的编程语言之一,尤其在开发桌面应用程序时,其强大的GUI(图形用户界面)框架使得开发者能够创建美观且功能丰富的应用。本教程聚焦于Java结合SWT(Standard Widget Toolkit)来构建GUI,SWT是...

    java的swt界面邮件发送软件

    Java的SWT界面邮件发送软件是一款使用Java编程语言开发的应用程序,它利用了SWT(Standard Widget Toolkit)库来创建用户界面,同时实现了邮件发送功能。SWT是Eclipse项目的一部分,提供了一套与操作系统原生GUI控件...

    java SWT简单小工具

    本项目名为"java SWT简单小工具",显然是一个使用SWT库开发的简易应用程序示例。 在描述中,"java SWT简单小工具"被重复提及,这可能表明该项目专注于展示如何使用SWT库来构建简单的GUI(图形用户界面)应用。由于...

Global site tag (gtag.js) - Google Analytics