`
xizhenyin
  • 浏览: 53033 次
  • 性别: 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;
	}
}

 

分享到:
评论

相关推荐

    通用IDispatch接口实现方法

    7. **创建和使用组件**:在客户端,可以使用CreateInstance函数创建组件实例,然后通过QueryInterface获取IDispatch接口,最后通过Invoke调用组件的方法和访问属性。 IDispatch接口的实现对于开发跨语言、跨平台的...

    COM IDispatch接口封装

    - **自动化**:IDispatch接口使得非编译时绑定成为可能,允许应用程序在运行时动态地发现和调用对象的属性和方法。 - **跨语言互操作**:不同编程语言的组件可以通过IDispatch接口进行通信,如VBScript和C++。 - ...

    qt导出activex接口

    你需要定义IDispatch接口,该接口包含了ActiveX控件对外提供的所有方法和属性的描述。 5. **头文件(Header Files)**:在描述中提到的压缩包可能包含ExportInterface.h这样的头文件,其中定义了ActiveX控件的接口...

    ActiveX控件漏洞挖掘入门

    IDispatch 接口是一个非常重要的接口,它提供了访问自动化对象暴露出来的方法和属性的方法。通过 GetTypeInfoCount、GetTypeInfo、GetIDsOfNames 和 Invoke 等函数,可以了解到 IDispatch 接口的使用方式。 ...

    VC控件开发实例教程

    ActiveX控件通过IDispatch接口支持属性和方法,使它们能被不同的程序访问和控制。同时,控件能够触发事件,通知包容器程序某些特定情况的发生。事件的触发通常通过调用自动化对象的方法,通过IDispatch接口实现。...

    ActiveX反射集成,方法事件调用.rar

    JavaScript通过IDispatch接口发送消息到ActiveX控件,然后控件执行相应的操作并返回结果。 事件监听是用户界面编程中不可或缺的部分。在ActiveX控件中,事件监听允许代码响应特定的用户行为或系统事件。例如,当...

    一个ActiveX控件的使用方法的例子

    这通常通过继承IDispatch接口来实现,以便控件可以处理来自脚本语言(如JavaScript)的调用。 3. **实现控件类**:创建一个ATL简单对象,例如命名为CMyControl,继承自IUnknown和IDispatch接口。在该类中,你需要...

    ActiveX控件的MFC开发方法

    在ActiveX控件中,可以通过以下方式来添加属性、方法和事件: 1. **自定义属性和方法**:这些属性和方法是控件开发者根据实际需求定义的。它们通过 `IDispatch` 接口提供给外部程序访问。 2. **库存属性和方法**:...

    用ATL和MFC来创建ActiveX控件.doc

    3. 连接点:通过实现IDispatch接口,ActiveX控件可以提供连接点,让其他组件订阅和响应控件的事件。 在MFC中,对COM的支持是通过CcmdTarget类和一系列宏实现的,如DECLARE_INTERFACE_MAP、BEGIN_INTERFACE_PART等。...

    用VC开发Activex

    接口类应该继承自IUnknown和IDispatch接口,这两个接口是所有ActiveX控件必须实现的。IUnknown提供了对象的引用计数和接口查询,而IDispatch则支持自动化和晚绑定,使得脚本语言能够调用控件的方法和属性。 在开发...

    COM 组件设计与应用(九)——IDispatch 接口 for VC6.0源代码

    IDispatch接口主要包含两个核心方法:`Invoke`和`GetIDsOfNames`。`Invoke`方法用于调用组件的方法或获取属性值,而`GetIDsOfNames`则用于将人类可读的成员名称转换为相应的DISPID(Dispatch ID),这是内部调用的...

    MFC-ActiveX-control-(MFCActiveX).zip_activex_activex control_mfc

    3. **IDispatch接口**:了解如何使用IDispatch接口来实现控件的自动化,允许脚本语言和VBA等环境访问控件。 4. **属性和方法的声明与实现**:学习如何声明和实现ActiveX控件的属性和方法,以便在宿主应用程序中使用...

    开发ActiveX控件OleEdit

    5. **属性和方法**:定义控件的属性和方法,这些可以通过IDispatch接口暴露给其他应用程序。在MFC中,可以使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏来支持运行时创建。 6. **注册控件**:为了在其他应用...

    ActiveX 英文文档详细介绍

    例如,常见的IUnknown接口提供了基础的引用计数和接口查询功能,IDispatch接口则提供了类型安全的访问控件属性和方法的方式。此外,还可以自定义特定于控件的接口,以扩展其功能。 四、ActiveX方法: ActiveX控件的...

    activex初学者资料整理

    使用VC++进行ActiveX开发涉及COM编程原理,包括IDispatch接口、事件处理、属性和方法的声明等。VC++的MFC库提供了一套类库,简化了ActiveX控件的创建过程。 6. **相关文章网址**: 提供的“相关文章网址.txt”...

    ActiveX控件 编写及使用例程

    ActiveX控件通常以`.ocx`文件的形式存在,它们提供了方法、属性和事件,使得其他应用程序可以通过接口调用这些功能,实现跨语言和跨平台的交互。 在本文中,我们将深入探讨如何使用C++来编写和使用ActiveX控件。...

    Delphi 测试ActiveX与JavaScript的交互

    1. IDispatch接口:JavaScript可以通过调用ActiveX控件的IDispatch接口来访问其属性和方法。 2. HTML元素对象模型:将ActiveX控件插入HTML元素中,然后通过DOM操作调用其方法。 3. JScript ActiveX Automation:...

    Windows核心编程之ActiveX.pdf

    - IDispatch接口:提供了一种机制,允许基于脚本语言或其他不支持全部COM接口的语言访问ActiveX控件。 - IUnknown接口:所有COM对象必须实现的接口,它定义了对象的引用计数和查询接口方法。 - ActiveX控件接口:一...

Global site tag (gtag.js) - Google Analytics