/**//*
* 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;
}
}
分享到:
相关推荐
7. **创建和使用组件**:在客户端,可以使用CreateInstance函数创建组件实例,然后通过QueryInterface获取IDispatch接口,最后通过Invoke调用组件的方法和访问属性。 IDispatch接口的实现对于开发跨语言、跨平台的...
- **自动化**:IDispatch接口使得非编译时绑定成为可能,允许应用程序在运行时动态地发现和调用对象的属性和方法。 - **跨语言互操作**:不同编程语言的组件可以通过IDispatch接口进行通信,如VBScript和C++。 - ...
你需要定义IDispatch接口,该接口包含了ActiveX控件对外提供的所有方法和属性的描述。 5. **头文件(Header Files)**:在描述中提到的压缩包可能包含ExportInterface.h这样的头文件,其中定义了ActiveX控件的接口...
IDispatch 接口是一个非常重要的接口,它提供了访问自动化对象暴露出来的方法和属性的方法。通过 GetTypeInfoCount、GetTypeInfo、GetIDsOfNames 和 Invoke 等函数,可以了解到 IDispatch 接口的使用方式。 ...
ActiveX控件通过IDispatch接口支持属性和方法,使它们能被不同的程序访问和控制。同时,控件能够触发事件,通知包容器程序某些特定情况的发生。事件的触发通常通过调用自动化对象的方法,通过IDispatch接口实现。...
JavaScript通过IDispatch接口发送消息到ActiveX控件,然后控件执行相应的操作并返回结果。 事件监听是用户界面编程中不可或缺的部分。在ActiveX控件中,事件监听允许代码响应特定的用户行为或系统事件。例如,当...
这通常通过继承IDispatch接口来实现,以便控件可以处理来自脚本语言(如JavaScript)的调用。 3. **实现控件类**:创建一个ATL简单对象,例如命名为CMyControl,继承自IUnknown和IDispatch接口。在该类中,你需要...
在ActiveX控件中,可以通过以下方式来添加属性、方法和事件: 1. **自定义属性和方法**:这些属性和方法是控件开发者根据实际需求定义的。它们通过 `IDispatch` 接口提供给外部程序访问。 2. **库存属性和方法**:...
3. 连接点:通过实现IDispatch接口,ActiveX控件可以提供连接点,让其他组件订阅和响应控件的事件。 在MFC中,对COM的支持是通过CcmdTarget类和一系列宏实现的,如DECLARE_INTERFACE_MAP、BEGIN_INTERFACE_PART等。...
接口类应该继承自IUnknown和IDispatch接口,这两个接口是所有ActiveX控件必须实现的。IUnknown提供了对象的引用计数和接口查询,而IDispatch则支持自动化和晚绑定,使得脚本语言能够调用控件的方法和属性。 在开发...
IDispatch接口主要包含两个核心方法:`Invoke`和`GetIDsOfNames`。`Invoke`方法用于调用组件的方法或获取属性值,而`GetIDsOfNames`则用于将人类可读的成员名称转换为相应的DISPID(Dispatch ID),这是内部调用的...
3. **IDispatch接口**:了解如何使用IDispatch接口来实现控件的自动化,允许脚本语言和VBA等环境访问控件。 4. **属性和方法的声明与实现**:学习如何声明和实现ActiveX控件的属性和方法,以便在宿主应用程序中使用...
5. **属性和方法**:定义控件的属性和方法,这些可以通过IDispatch接口暴露给其他应用程序。在MFC中,可以使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏来支持运行时创建。 6. **注册控件**:为了在其他应用...
例如,常见的IUnknown接口提供了基础的引用计数和接口查询功能,IDispatch接口则提供了类型安全的访问控件属性和方法的方式。此外,还可以自定义特定于控件的接口,以扩展其功能。 四、ActiveX方法: ActiveX控件的...
使用VC++进行ActiveX开发涉及COM编程原理,包括IDispatch接口、事件处理、属性和方法的声明等。VC++的MFC库提供了一套类库,简化了ActiveX控件的创建过程。 6. **相关文章网址**: 提供的“相关文章网址.txt”...
ActiveX控件通常以`.ocx`文件的形式存在,它们提供了方法、属性和事件,使得其他应用程序可以通过接口调用这些功能,实现跨语言和跨平台的交互。 在本文中,我们将深入探讨如何使用C++来编写和使用ActiveX控件。...
1. IDispatch接口:JavaScript可以通过调用ActiveX控件的IDispatch接口来访问其属性和方法。 2. HTML元素对象模型:将ActiveX控件插入HTML元素中,然后通过DOM操作调用其方法。 3. JScript ActiveX Automation:...
- IDispatch接口:提供了一种机制,允许基于脚本语言或其他不支持全部COM接口的语言访问ActiveX控件。 - IUnknown接口:所有COM对象必须实现的接口,它定义了对象的引用计数和查询接口方法。 - ActiveX控件接口:一...