COM操縱SWT Browser控件

通過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];

//創建OleAutomation對象
OleAutomation auto = new OleAutomation(clientSite);
//調用OleAutomation對象的一個方法,例如 ExecWB(7,1)打印預覽
invoke(auto,"ExecWB",7,1);
//釋放OleAutomation對象
auto.dispose();

下面這段代碼是對OleAutomation方法調用的封裝。提供了簡單的調用
OleAutomatinon方法。

對於任何OleAutomation對象,只需要invoke(Ole對象,"方法名",參數列表...);
/**
* 執行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[i]);
variants[i] = variant;
}

Variant pVarResult = automation.invoke(dispIdMember, variants);

//釋放參數對象
for (int i = 0; i < variants.length; i++) {
variants[i].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;
}
發佈了33 篇原創文章 · 獲贊 0 · 訪問量 8954
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章