`
xizhenyin
  • 浏览: 51346 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

通过IDispatch接口,获得ActiveX的属性,方法

阅读更多
/**//*
 * OLE and ActiveX example snippet: browse the typelibinfo for a program id
 * 
 * For a list of all SWT example snippets see
 * http://dev.eclipse.org/viewcvs/i.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets
 */
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.internal.ole.win32.TYPEATTR;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.OleFunctionDescription;
import org.eclipse.swt.ole.win32.OlePropertyDescription;
import org.eclipse.swt.widgets.Shell;

public class ListOLE {

	public static void main(String[] args) {

		String progID = "CAMERA.CameraCtrl.1";

		Shell shell = new Shell();

		OleFrame frame = new OleFrame(shell, SWT.NONE);
		OleControlSite site = null;
		OleAutomation auto = null;
		try {
			site = new OleControlSite(frame, SWT.NONE, "ShockwaveFlash.ShockwaveFlash");
			auto = new OleAutomation(site);
		} catch (SWTException ex) {
			System.out.println("Unable to open type library for " + progID);
			return;
		}

		TYPEATTR typeattr = auto.getTypeInfoAttributes();
		if (typeattr != null) {
			if (typeattr.cFuncs > 0)
				System.out.println("Functions for " + progID + " :\n");
			for (int i = 0; i < typeattr.cFuncs; i++) {
				OleFunctionDescription data = auto.getFunctionDescription(i);
				String argList = "";
				int firstOptionalArgIndex = data.args.length
						- data.optionalArgCount;
				for (int j = 0; j < data.args.length; j++) {
					argList += "[";
					if (j >= firstOptionalArgIndex)
						argList += "optional, ";
					argList += getDirection(data.args[j].flags) + "] "
							+ getTypeName(data.args[j].type) + " "
							+ data.args[j].name;
					if (j < data.args.length - 1)
						argList += ", ";
				}
				System.out.println(getInvokeKind(data.invokeKind) + " (id = "
						+ data.id + ") : " + "\n\tSignature   : "
						+ getTypeName(data.returnType) + " " + data.name + "("
						+ argList + ")" + "\n\tDescription : "
						+ data.documentation + "\n\tHelp File   : "
						+ data.helpFile + "\n");
			}

			if (typeattr.cVars > 0)
				System.out.println("\n\nVariables for " + progID + " :\n");
			for (int i = 0; i < typeattr.cVars; i++) {
				OlePropertyDescription data = auto.getPropertyDescription(i);
				System.out.println("PROPERTY (id = " + data.id + ") :"
						+ "\n\tName : " + data.name + "\n\tType : "
						+ getTypeName(data.type) + "\n");
			}
		}

		auto.dispose();
		shell.dispose();
	}

	private static String getTypeName(int type) {
		switch (type) {
		case OLE.VT_BOOL:
			return "boolean";
		case OLE.VT_R4:
			return "float";
		case OLE.VT_R8:
			return "double";
		case OLE.VT_I4:
			return "int";
		case OLE.VT_DISPATCH:
			return "IDispatch";
		case OLE.VT_UNKNOWN:
			return "IUnknown";
		case OLE.VT_I2:
			return "short";
		case OLE.VT_BSTR:
			return "String";
		case OLE.VT_VARIANT:
			return "Variant";
		case OLE.VT_CY:
			return "Currency";
		case OLE.VT_DATE:
			return "Date";
		case OLE.VT_UI1:
			return "unsigned char";
		case OLE.VT_UI4:
			return "unsigned int";
		case OLE.VT_USERDEFINED:
			return "UserDefined";
		case OLE.VT_HRESULT:
			return "int";
		case OLE.VT_VOID:
			return "void";

		case OLE.VT_BYREF | OLE.VT_BOOL:
			return "boolean *";
		case OLE.VT_BYREF | OLE.VT_R4:
			return "float *";
		case OLE.VT_BYREF | OLE.VT_R8:
			return "double *";
		case OLE.VT_BYREF | OLE.VT_I4:
			return "int *";
		case OLE.VT_BYREF | OLE.VT_DISPATCH:
			return "IDispatch *";
		case OLE.VT_BYREF | OLE.VT_UNKNOWN:
			return "IUnknown *";
		case OLE.VT_BYREF | OLE.VT_I2:
			return "short *";
		case OLE.VT_BYREF | OLE.VT_BSTR:
			return "String *";
		case OLE.VT_BYREF | OLE.VT_VARIANT:
			return "Variant *";
		case OLE.VT_BYREF | OLE.VT_CY:
			return "Currency *";
		case OLE.VT_BYREF | OLE.VT_DATE:
			return "Date *";
		case OLE.VT_BYREF | OLE.VT_UI1:
			return "unsigned char *";
		case OLE.VT_BYREF | OLE.VT_UI4:
			return "unsigned int *";
		case OLE.VT_BYREF | OLE.VT_USERDEFINED:
			return "UserDefined *";
		}
		return "unknown " + type;
	}

	private static String getDirection(int direction) {
		String dirString = "";
		boolean comma = false;
		if ((direction & OLE.IDLFLAG_FIN) != 0) {
			dirString += "in";
			comma = true;
		}
		if ((direction & OLE.IDLFLAG_FOUT) != 0) {
			if (comma)
				dirString += ", ";
			dirString += "out";
			comma = true;
		}
		if ((direction & OLE.IDLFLAG_FLCID) != 0) {
			if (comma)
				dirString += ", ";
			dirString += "lcid";
			comma = true;
		}
		if ((direction & OLE.IDLFLAG_FRETVAL) != 0) {
			if (comma)
				dirString += ", ";
			dirString += "retval";
		}

		return dirString;
	}

	private static String getInvokeKind(int invKind) {
		switch (invKind) {
		case OLE.INVOKE_FUNC:
			return "METHOD";
		case OLE.INVOKE_PROPERTYGET:
			return "PROPERTY GET";
		case OLE.INVOKE_PROPERTYPUT:
			return "PROPERTY PUT";
		case OLE.INVOKE_PROPERTYPUTREF:
			return "PROPERTY PUT BY REF";
		}
		return "unknown " + invKind;
	}
}

 

分享到:
评论

相关推荐

    Visual C++实践与提高-COM和COM+篇『PDF』

    7.1.3 IDispatch接口 7.1.3.1 GetTypeInfoCount和GetTypeInfo 7.1.3.2 GetIDsOfNames 7.1.3.3 Invoke 7.1.4 类型库和ODL 7.1.5 VARIANT数据类型 7.2 用MFC开发自动化组件——例程MFCSampleExe 7.2.1 创建最小的MFC...

    COM与COM+从入门到精通(pdf版本,含源码)

    属性与方法 控件与容器通信 事件与连接点 建立第一个控件 生成控件 测试控件 增加方法 增加属性 增加事件 增加属性页 允许属性保持 使用控件 建立复合控件 增加复合控件 增加功能 增加事件 处理复合...

    C#版ActiveX + JS +Flex通讯 完整实现

    7:为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值):(這里是直接copy網上的) using System; using System.Collections....

    D5开发人员指南-05卷

    23.6.1 IDispatch接口 724 23.6.2 类型信息 725 23.6.3 后期捆绑与前期捆绑 725 23.6.4 注册 725 23.6.5 创建自动化服务器 725 23.6.6 创建自动化控制器 740 23.7 高级自动化技术 745 23.7.1 自动化事件 745 23.7.2 ...

    Delphi5开发人员指南

    7.8.3 调用ActiveX控件的方法 165 7.9 总结 166 第二部分 高级技术 第8章 使用GDI和字体的图像编程 167 8.1 TImage:Delphi的图像显示 167 8.2 存储图像 168 8.3 使用TCanvas的属性 169 8.3.1 画笔 170 8.3.2 使用...

    VC++常用功能实例

    问:如何使用COleClientItem的IDispatch接口? 70 问:关于用户自定义的消息使用? 71 问:在打开一个文档时退出? 71 问:在CListCtrl控件中多选择项的删除? 71 问:工作线程的登录状态? 72 问:如何控制菜单的大小? ...

    VC++常用的共用函数100多页

    问:如何使用COleClientItem的IDispatch接口? 70 问:关于用户自定义的消息使用? 71 问:在打开一个文档时退出? 71 问:在CListCtrl控件中多选择项的删除? 71 问:工作线程的登录状态? 72 问:如何控制菜单的大小? ...

    Eclipse权威开发指南3.pdf

    5.4.7 在Team快捷菜单中可获得的CVS操作..... 144 5.4.8 Team Synchronizing透视图和Synchronize向导..... 146 5.4.9 处理同一文件的并发更新..... 147 5.4.10 使用CVS的Watch/Edit 支持以避免对同一文件...

    Eclipse权威开发指南1.pdf

    5.4.7 在Team快捷菜单中可获得的CVS操作..... 144 5.4.8 Team Synchronizing透视图和Synchronize向导..... 146 5.4.9 处理同一文件的并发更新..... 147 5.4.10 使用CVS的Watch/Edit 支持以避免对同一文件...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    Eclipse权威开发指南2.pdf

    5.4.7 在Team快捷菜单中可获得的CVS操作..... 144 5.4.8 Team Synchronizing透视图和Synchronize向导..... 146 5.4.9 处理同一文件的并发更新..... 147 5.4.10 使用CVS的Watch/Edit 支持以避免对同一文件的 ...

    VC++ 专家指导.doc

    (16)如何使用COleClientItem的IDispatch接口? 97 (17)关于用户自定义的消息使用? 98 (18)在打开一个文档时退出? 99 (19)在CListCtrl控件中多选择项的删除? 99 (20)工作线程的登录状态? 99 (21)如何增加视图中ActiveX...

Global site tag (gtag.js) - Google Analytics