风之语

posts(135) comments(156) trackbacks(1)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

News

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • ajax(1)
  • AppFuse(1)
  • iText(1)
  • JSF(8)
  • linux(3)
  • maven(1)
  • MSTR
  • Open XML(1)
  • Oracle(8)
  • RCP
  • Struts(2)
  • SybaseIQ(6)
  • tapestry
  • tomcat(2)
  • webservice(1)
  • 收藏(25)
  • 数据仓库(9)
  • 架构设计(3)
  • 生活(1)
  • 项目管理(2)

随笔档案

  • 2008年9月 (1)
  • 2008年7月 (2)
  • 2008年6月 (4)
  • 2008年5月 (6)
  • 2008年4月 (1)
  • 2008年3月 (1)
  • 2007年12月 (2)
  • 2007年11月 (5)
  • 2007年10月 (2)
  • 2007年9月 (3)
  • 2007年8月 (3)
  • 2007年4月 (1)
  • 2007年3月 (2)
  • 2007年2月 (2)
  • 2007年1月 (2)
  • 2006年12月 (3)
  • 2006年8月 (2)
  • 2006年7月 (2)
  • 2006年6月 (2)
  • 2006年4月 (2)
  • 2006年3月 (1)
  • 2006年2月 (3)
  • 2006年1月 (6)
  • 2005年12月 (6)
  • 2005年11月 (4)
  • 2005年10月 (17)
  • 2005年9月 (26)
  • 2005年8月 (16)
  • 2005年7月 (8)

相册

  • 技术图片

收藏夹

  • java

link

My wife

  • My wife's blog

最新随笔

  • 1. 设置正确的Content-Type以解决Ext的中文乱码问题
  • 2. 关于JFreechart柱状图 柱上不能显示数值的问题
  • 3. 快速创建个性化iGoogle主题的3个方法
  • 4. Apache Maven 2 简介(目前最全的技术资料了)
  • 5. 使用 AppFuse 的七个理由
  • 6. MyEclipse 6.5注册
  • 7. tomcat中的Server.xml元素详解
  • 8. Java 使用SWT 创建COM对象
  • 9.  如何在Java中嵌入IE
  • 10. 如何在Java内读取COM接口中所有的方法和属性

搜索

  •  

积分与排名

  • 积分 - 140097
  • 排名 - 51

最新评论

  • 1. re: 基于Weblogic Server 8.1 ant工具开发Web Service
  • 如果知道 问题所以请联系rxiaoliang@sina.com
  • --liuxl
  • 2. re: 基于Weblogic Server 8.1 ant工具开发Web Service
  • 评论内容较长,点击标题查看
  • --liuxl
  • 3. re: MyEclipse4.0破解[未登录]
  • 这个破解文件怎么下载不下来啊
  • --long
  • 4. re: 一个政府项目总结
  • 哎. 兄弟, 同感. 做政府项目 就是苦............
  • --啊牛。
  • 5. re: 最新版的MyEclipse4.0及其破解
  • ertwertwertwret
  • --discovery12

阅读排行榜

评论排行榜

View Post

Java 使用SWT 创建COM对象

import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.ole.win32.COM;
import org.eclipse.swt.internal.ole.win32.DISPPARAMS;
import org.eclipse.swt.internal.ole.win32.EXCEPINFO;
import org.eclipse.swt.internal.ole.win32.GUID;
import org.eclipse.swt.internal.ole.win32.IDispatch;
import org.eclipse.swt.internal.ole.win32.ITypeInfo;
import org.eclipse.swt.internal.ole.win32.IUnknown;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.Variant;

/*
 * Created on 2006-7-11
 *
 *
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author hcw
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class CComObject {
 private GUID guid = new GUID();
 //private GUID IID = new GUID();
 private IDispatch Autoface = null;
 private ITypeInfo TypeInfo = null;
 private String FMachineName = null;
 
 private void CreateComObject() throws Exception{
  dispose();
  
  int[] ppv = new int[1];
  
  int ret = COM.CoCreateInstance(guid, 0,
    COM.CLSCTX_INPROC_SERVER | COM.CLSCTX_LOCAL_SERVER,
    COM.IIDIUnknown, ppv);
  if(ret!=COM.S_OK)
   OLE.error(ret);
   //throw new Exception("对象创建失败!");
  
  IUnknown objIUnknown = new IUnknown(ppv[0]);
  ppv = new int[1];
  
  ret = objIUnknown.QueryInterface(COM.IIDIDispatch, ppv);
  objIUnknown.Release();
  if(ret!=COM.S_OK)
   OLE.error(ret);
   //throw new Exception("对象不支持Dispatch!");
  
  Autoface = new IDispatch(ppv[0]);

  ppv = new int[1];
  ret = Autoface.GetTypeInfo(0, COM.LOCALE_USER_DEFAULT, ppv);
  if (ret == OLE.S_OK) {
   TypeInfo = new ITypeInfo(ppv[0]);
   TypeInfo.AddRef();
  
  }

 }
 
 private int getIDsOfNames(String name){
  int[] rgdispid = new int[1];
  String[] names = new String[]{name};
  int ret = Autoface.GetIDsOfNames(guid, names, names.length, COM.LOCALE_USER_DEFAULT, rgdispid);
  if (ret != COM.S_OK) return -1;
  
  return rgdispid[0];
 }

 private void getVariantData(Variant aVar, int pData){
  if (pData == 0) OLE.error(OLE.ERROR_OUT_OF_MEMORY);
  
  COM.VariantInit(pData);

  if ((aVar.getType() & COM.VT_BYREF) == COM.VT_BYREF) {
   COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
   COM.MoveMemory(pData + 8, new int[]{aVar.getByRef()}, 4);
   return;
  }

  switch (aVar.getType()) {
   case COM.VT_EMPTY :
    break;
   case COM.VT_BOOL :
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    COM.MoveMemory(pData + 8, new int[]{(aVar.getBoolean()) ? COM.VARIANT_TRUE : COM.VARIANT_FALSE}, 2);
    break;
   case COM.VT_R4 :
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    COM.MoveMemory(pData + 8, new float[]{aVar.getFloat()}, 4);
    break;
   case COM.VT_I4 :
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    COM.MoveMemory(pData + 8, new int[]{aVar.getInt()}, 4);
    break;
   case COM.VT_DISPATCH :
    aVar.getDispatch().AddRef();
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    COM.MoveMemory(pData + 8, new int[]{aVar.getDispatch().getAddress()}, 4);
    break;
   case COM.VT_UNKNOWN :
    aVar.getUnknown().AddRef();
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    COM.MoveMemory(pData + 8, new int[]{aVar.getUnknown().getAddress()}, 4);
    break;
   case COM.VT_I2 :
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    COM.MoveMemory(pData + 8, new short[]{aVar.getShort()}, 2);
    break;
   case COM.VT_BSTR :
    COM.MoveMemory(pData, new short[] {aVar.getType()}, 2);
    char[] data = (aVar.getString()+"\0").toCharArray();
    int ptr = COM.SysAllocString(data);
    COM.MoveMemory(pData + 8, new int[] {ptr}, 4);
    break;
  
   default :
    OLE.error(SWT.ERROR_NOT_IMPLEMENTED);
  }
 }
 
 private Variant setVariantData(int pData){
  if (pData == 0) OLE.error(OLE.ERROR_INVALID_ARGUMENT);

  Variant ret = null;
  short[] dataType = new short[1];
  COM.MoveMemory(dataType, pData, 2);
  int type = dataType[0];

  if ((type & COM.VT_BYREF) == COM.VT_BYREF) {
   int[] newByRefPtr = new int[1];
   OS.MoveMemory(newByRefPtr, pData + 8, 4);
   return new Variant(newByRefPtr[0], COM.VT_BYREF);
  }
  
  switch (type) {
   case COM.VT_EMPTY :
    break;
   case COM.VT_BOOL :
    short[] newBooleanData = new short[1];
    COM.MoveMemory(newBooleanData, pData + 8, 2);
    ret = new Variant(newBooleanData[0]!=0);
    break;
   case COM.VT_R4 :
    float[] newFloatData = new float[1];
    COM.MoveMemory(newFloatData, pData + 8, 4);
    ret = new Variant(newFloatData[0]);
    break;
   case COM.VT_I4 :
    int[] newIntData = new int[1];
    OS.MoveMemory(newIntData, pData + 8, 4);
    ret = new Variant(newIntData[0]);
    break;
   case COM.VT_DISPATCH : {
    int[] ppvObject = new int[1];
    OS.MoveMemory(ppvObject, pData + 8, 4);
    if (ppvObject[0] == 0) {
     type = COM.VT_EMPTY;
     break;
    }
    ret = new Variant(new IDispatch(ppvObject[0]));
    break;
   }
   case COM.VT_UNKNOWN : {
    int[] ppvObject = new int[1];
    OS.MoveMemory(ppvObject, pData + 8, 4);
    if (ppvObject[0] == 0) {
     type = COM.VT_EMPTY;
     break;
    }
    ret = new Variant(new IUnknown(ppvObject[0]));
    break;
   }
   case COM.VT_I2 :
    short[] newShortData = new short[1];
    COM.MoveMemory(newShortData, pData + 8, 2);
    ret = new Variant(newShortData[0]);
    break;
   case COM.VT_BSTR :
    // get the address of the memory in which the string resides
    int[] hMem = new int[1];
    OS.MoveMemory(hMem, pData + 8, 4);
    if (hMem[0] == 0) {
     type = COM.VT_EMPTY;
     break;
    }
    int size = COM.SysStringByteLen(hMem[0]);
    if (size > 0){
     char[] buffer = new char[(size + 1) /2]; // add one to avoid rounding errors
     COM.MoveMemory(buffer, hMem[0], size);
     ret = new Variant(new String(buffer));
    } else {
     ret = new Variant(""); //$NON-NLS-1$
    }
    break;
  
   default :
    int newPData = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, Variant.sizeof);
    if (COM.VariantChangeType(newPData, pData, (short) 0, COM.VT_R4) == COM.S_OK) {
     ret = setVariantData(newPData);
    } else if (COM.VariantChangeType(newPData, pData, (short) 0, COM.VT_I4) == COM.S_OK) {
     setVariantData(newPData);
    } else if (COM.VariantChangeType(newPData, pData, (short) 0, COM.VT_BSTR) == COM.S_OK) {
     ret = setVariantData(newPData);
    }
    COM.VariantClear(newPData);
    OS.GlobalFree(newPData);
    break;
  }
  return ret;
 }

 private int invoke(int dispIdMember, int wFlags, Variant[] rgvarg, int[] rgdispidNamedArgs, Variant[] pVarResult) {

  if (Autoface == null) return COM.E_FAIL;
  
  DISPPARAMS pDispParams = new DISPPARAMS();
  if (rgvarg != null && rgvarg.length > 0) {
   pDispParams.cArgs = rgvarg.length;
   pDispParams.rgvarg = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, Variant.sizeof * rgvarg.length);
   int offset = 0;
   for (int i = rgvarg.length - 1; i >= 0 ; i--) {
    getVariantData(rgvarg[i], pDispParams.rgvarg + offset);
    offset += Variant.sizeof;
   }
  }

  if (rgdispidNamedArgs != null && rgdispidNamedArgs.length > 0) {
   pDispParams.cNamedArgs = rgdispidNamedArgs.length;
   pDispParams.rgdispidNamedArgs = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, 4 * rgdispidNamedArgs.length);
   int offset = 0;
   for (int i = rgdispidNamedArgs.length; i > 0; i--) {
    COM.MoveMemory(pDispParams.rgdispidNamedArgs + offset, new int[] {rgdispidNamedArgs[i-1]}, 4);
    offset += 4;
   }
  }

  EXCEPINFO excepInfo = new EXCEPINFO();
  int[] pArgErr = new int[1];
  int pVarResultAddress = 0;
  if (pVarResult != null) 
   pVarResultAddress = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, Variant.sizeof);
  int ret = Autoface.Invoke(dispIdMember, new GUID(), COM.LOCALE_USER_DEFAULT, wFlags, pDispParams, pVarResultAddress, excepInfo, pArgErr);
  if(ret!=COM.S_OK)
   return ret;

  if (pVarResultAddress != 0){
   pVarResult[0] = setVariantData(pVarResultAddress);
   COM.VariantClear(pVarResultAddress);
   OS.GlobalFree(pVarResultAddress);
  }
  
  if (pDispParams.rgdispidNamedArgs != 0){
   OS.GlobalFree(pDispParams.rgdispidNamedArgs);
  }
  if (pDispParams.rgvarg != 0) {
   int offset = 0;
   for (int i = 0, length = rgvarg.length; i < length; i++){
    COM.VariantClear(pDispParams.rgvarg + offset);
    offset += Variant.sizeof;
   }
   OS.GlobalFree(pDispParams.rgvarg);
  }

  return ret;
 }

 /**
  * 创建空对象在使用需调用CreateComObject或CreateComObjectProgID创建COM对象。
  *
  */
 public CComObject(){
  
 }
 /**
  * 使用CLSID创建COM对象,建构后可以调用COM对象方法或属性。
  * @param sCLSID COM对象CLSID
  * @throws Exception
  */
 public CComObject(String sCLSID) throws Exception{
  COM.IIDFromString(sCLSID.toCharArray(), guid);
  CreateComObject();
 }

 /**
  * 使用现有自动化对象接口创建COM对象。
  * @param prgDispatch
  */
 public CComObject(IDispatch prgDispatch){
  Autoface = prgDispatch;
  Autoface.AddRef();
 }
 
 /**
  * 使用CLSID创建COM对象。可用于创建新的对象(原有对象将释放)
  * @param sCLSID
  * @return
  * @throws Exception
  */
 public IDispatch CreateComObject(String sCLSID) throws Exception{
  COM.IIDFromString(sCLSID.toCharArray(), guid);
  CreateComObject();
  return Autoface;
 }
 
 /**
  * 创建远程COM对象(未实现)。
  * @param MachineName
  * @param sCLSID
  * @return
  */
 public IDispatch CreateRemoteComObject(String MachineName, String sCLSID){
  COM.IIDFromString(sCLSID.toCharArray(), guid);
  return Autoface;
 }
 
 /**
  * 使用ProgID创建COM对象。
  * @param ProgID
  * @return
  * @throws Exception
  */
 public IDispatch CreateComObjectProgID(String ProgID) throws Exception{
  COM.CLSIDFromProgID(ProgID.toCharArray(), guid);
  CreateComObject();
  return Autoface;
 }
 
 /**
  * 调用COM对象方法,有返回值(可变参数暂不支持)。
  * @param FunctionName
  * @param rgvarg
  * @return
  * @throws Exception
  */
 public Variant CallFunction(String FunctionName, Variant[] rgvarg) throws Exception{
  if(Autoface==null)
   throw new Exception("对象为空");
  int rgdispid = getIDsOfNames(FunctionName);
  if(rgdispid==-1)
   throw new Exception("方法不支持!");
  Variant[] pVarResult = new Variant[1];
  int ret = invoke(rgdispid, COM.DISPATCH_METHOD, rgvarg, null, pVarResult);
  if(ret!=COM.S_OK)
   OLE.error(ret);
   //throw new Exception("方法调用失败!");
  return pVarResult[0];
 }
 
 /**
  * 调用COM对象方法,无参数和返回值。
  * @param FunctionName
  * @throws Exception
  */
 public void CallFunction(String FunctionName) throws Exception{
  CallFunction(FunctionName, new Variant[]{});
 }
 
 /**
  * 获取COM对象属性值。
  * @param PropertyName
  * @param rgvarg
  * @return
  * @throws Exception
  */
 public Variant getProperty(String PropertyName, Variant[] rgvarg) throws Exception{
  if(Autoface==null)
   throw new Exception("对象为空");
  int rgdispid = getIDsOfNames(PropertyName);
  if(rgdispid==-1)
   throw new Exception("属性不支持!");
  Variant[] pVarResult = new Variant[1];
  int ret = invoke(rgdispid, COM.DISPATCH_PROPERTYGET, rgvarg, null, pVarResult);
  if(ret!=COM.S_OK)
   OLE.error(ret);
   //throw new Exception("属性获取失败");
  return pVarResult[0];
   
 }
 
 /**
  * 给COM对象属性赋值。
  * @param PropertyName
  * @param rgvarg
  * @throws Exception
  */
 public void setProperty(String PropertyName, Variant[] rgvarg) throws Exception{
  if(Autoface==null)
   throw new Exception("对象为空");
  int rgdispid = getIDsOfNames(PropertyName);
  if(rgdispid==-1)
   throw new Exception("属性不支持!");
  int[] rgdispidNamedArgs = new int[] {COM.DISPID_PROPERTYPUT};
  int dwFlags = COM.DISPATCH_PROPERTYPUT;
  for (int i = 0; i < rgvarg.length; i++) {
   if ((rgvarg[i].getType() & COM.VT_BYREF) == COM.VT_BYREF)
   dwFlags = COM.DISPATCH_PROPERTYPUTREF;
  }
  Variant[] pVarResult = new Variant[1];
  int ret = invoke(rgdispid, dwFlags, rgvarg, rgdispidNamedArgs, pVarResult);
  if(ret != COM.S_OK)
   OLE.error(ret);
   //throw new Exception("属性设置失败!"); 
 }
 
 /**
  * 释放COM对象的连接。在对象不用的时候需调用此函数,以便及时释放对象。
  *
  */
 public void dispose(){
  if(Autoface!=null)
   Autoface.Release();
  Autoface = null;
  if(TypeInfo!=null)
   TypeInfo.Release();
  TypeInfo = null;
 }
 
}

posted on 2008-05-18 09:20 风 阅读(181) 评论(0)  编辑  收藏

新闻频道  新用户注册  刷新评论列表  

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 
相关链接:
网站导航:
博客园      BlogJava   博客生活   IT博客网   C++博客   PHP博客   博客园社区
管理博客   教师博客     天文博客   汽车博客   足球博客   股票博客   电子博客  管理

 
Powered by:
BlogJava
Copyright © 风