在Eclipse論壇上看到的文章,很不錯,拿過來共享一下. 通過OleAutomation 來調用Browser內部的瀏覽器組件打印,如果對SWT調用COM操作不熟悉,請參閱相關文檔。
常用方法列表 ExecWB(1,1) 打開 ExecWB(2,1) 關閉現在所有的IE窗口,并打開一個新窗口 ExecWB(4,1) 保存網頁 ExecWB(6,1) 打印 ExecWB(7,1) 打印預覽 ExecWB(8,1) 打印頁面設置 ExecWB(10,1) 查看頁面屬性 ExecWB(17,1) 全選 ExecWB(22,1) 刷新 ExecWB(45,1) 關閉窗體無提示
//首先獲取Browser內部的OleClientSite,也就是瀏覽器對象 //此方式打破了Browser封裝,一般不建議使用 OleClientSite clientSite = (OleClientSite) ((Composite) browser.getChildren()[0]).getChildren()[0];
//創(chuàng)建OleAutomation對象 OleAutomation auto = new OleAutomation(clientSite); //調用OleAutomation對象的一個方法,例如 ExecWB(7,1)打印預覽 invoke(auto,"ExecWB",7,1); //釋放OleAutomation對象 auto.dispose();
下面這段代碼是對OleAutomation方法調用的封裝。提供了簡單的調用 OleAutomatinon方法。
對于任何OleAutomation對象,只需要invoke(Ole對象,"方法名",參數列表...);
/** * 執(zhí)行OleAutomation的一個方法 * @param automation * @param funcName 方法名 * @param values 參數列表 * @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) { //無參數方法調用 Variant pVarResult = automation.invoke(dispIdMember); if (pVarResult != null) { Object value = getValue(pVarResult); pVarResult.dispose(); return value; } } else { //構造參數列表 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); //釋放參數對象 for (int i = 0; i < variants.length; i++) { variants.dispose(); } //獲取調用結果 if (pVarResult != null) { Object value = getValue(pVarResult); pVarResult.dispose(); return value; }
}
return null;
}
/** * 將Java對象轉換為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轉換為Java對象 * @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; } | |