电竞比分网-中国电竞赛事及体育赛事平台

分享

一篇使用COM操縱SWT Browser控件的文章

 Long_way 2007-07-10
一篇使用COM操縱SWT Browser控件的文章
2006-07-12 00:11:10
在Eclipse論壇上看到的文章,很不錯(cuò),拿過(guò)來(lái)共享一下.
 
通過(guò)OleAutomation 來(lái)調(diào)用Browser內(nèi)部的瀏覽器組件打印,如果對(duì)SWT調(diào)用COM操作不熟悉,請(qǐng)參閱相關(guān)文檔。

常用方法列表
ExecWB(1,1) 打開(kāi)
ExecWB(2,1) 關(guān)閉現(xiàn)在所有的IE窗口,并打開(kāi)一個(gè)新窗口
ExecWB(4,1) 保存網(wǎng)頁(yè)
ExecWB(6,1) 打印
ExecWB(7,1) 打印預(yù)覽
ExecWB(8,1) 打印頁(yè)面設(shè)置
ExecWB(10,1) 查看頁(yè)面屬性
ExecWB(17,1) 全選
ExecWB(22,1) 刷新
ExecWB(45,1) 關(guān)閉窗體無(wú)提示


//首先獲取Browser內(nèi)部的OleClientSite,也就是瀏覽器對(duì)象
//此方式打破了Browser封裝,一般不建議使用
OleClientSite clientSite = (OleClientSite) ((Composite) browser.getChildren()[0]).getChildren()[0];

//創(chuàng)建OleAutomation對(duì)象
OleAutomation auto = new OleAutomation(clientSite);
//調(diào)用OleAutomation對(duì)象的一個(gè)方法,例如 ExecWB(7,1)打印預(yù)覽
invoke(auto,"ExecWB",7,1);
//釋放OleAutomation對(duì)象
auto.dispose();

下面這段代碼是對(duì)OleAutomation方法調(diào)用的封裝。提供了簡(jiǎn)單的調(diào)用
OleAutomatinon方法。

對(duì)于任何OleAutomation對(duì)象,只需要invoke(Ole對(duì)象,"方法名",參數(shù)列表...);



  /**
  * 執(zhí)行OleAutomation的一個(gè)方法
  * @param automation
  * @param funcName 方法名
  * @param values 參數(shù)列表
  * @return 返回值
  */
  public Object invoke(OleAutomation automation, String funcName, Object... values) {
     //獲取方法ID
    int[] rgdispid = automation.getIDsOfNames(new String[] { funcName });
    if (rgdispid == null || rgdispid.length == 0) {
        return null;
    }

    int dispIdMember = rgdispid[0];

    if (values == null || values.length == 0) {
         //無(wú)參數(shù)方法調(diào)用
        Variant pVarResult = automation.invoke(dispIdMember);
        if (pVarResult != null) {
          Object value = getValue(pVarResult);
          pVarResult.dispose();
          return value;
        }
    } else {
         
         //構(gòu)造參數(shù)列表
        Variant[] variants = new Variant[values.length];
        for (int i = 0; i < values.length; i++) {
          Variant variant = createVariant(values
);
          variants
= variant;
        }

        Variant pVarResult = automation.invoke(dispIdMember, variants);
       
        //釋放參數(shù)對(duì)象
        for (int i = 0; i < variants.length; i++) {
          variants
.dispose();
        }
       
        //獲取調(diào)用結(jié)果
        if (pVarResult != null) {
          Object value = getValue(pVarResult);
          pVarResult.dispose();
          return value;
        }

    }

    return null;

  }

  /**
  * 將Java對(duì)象轉(zhuǎn)換為Variant
  * @param value
  * @return
  */
 
  private Variant createVariant(Object value) {
    Variant variant = null;

    if (value == null) {
        variant = new Variant();
    } else if (value instanceof Boolean) {
        variant = new Variant(((Boolean) value).booleanValue());
    } else if (value instanceof Short) {
        variant = new Variant(((Short) value).shortValue());
    } else if (value instanceof Integer) {
        variant = new Variant(((Integer) value).intValue());
    } else if (value instanceof Float) {
        variant = new Variant(((Float) value).floatValue());
    } else if (value instanceof String) {
        variant = new Variant(value.toString());
    } else if (value instanceof IDispatch) {
        variant = new Variant((IDispatch) value);
    } else if (value instanceof IUnknown) {
        variant = new Variant((IUnknown) value);
    } else if (value instanceof OleAutomation) {
        variant = new Variant((OleAutomation) value);
    }
    return variant;
  }



  /**
  * 將Variant轉(zhuǎn)換為Java對(duì)象
  * @param variant
  * @return
  */
 
  private Object getValue(Variant variant) {

    short type = variant.getType();

    switch (type) {
    case COM.VT_BOOL:
        return variant.getBoolean();
    case COM.VT_I2:
        return variant.getShort();
    case COM.VT_I4:
        return variant.getInt();
    case COM.VT_R4:
        return variant.getFloat();
    case COM.VT_BSTR:
        return variant.getString();
    case COM.VT_DISPATCH:
        return variant.getAutomation();
    case COM.VT_UNKNOWN:
        return variant;
    case COM.VT_EMPTY:
        return null;
    }
    if ((type & COM.VT_BYREF) != 0) {
        return variant.getByRef();
    }

    return null;
  }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多