在 Windows 平台,SWT 提供 org.eclipse.swt.ole.win32 套件支援 OLE/ActiveX 嵌入。本文示範在 RCP 視圖中嵌入 Microsoft Web Browser 控件(Shell.Explorer.2),並透過 OleAutomation 呼叫 Navigate 方法載入網頁。
ProgID(如 Shell.Explorer.2)。使用 Visual Studio 自帶 OleView.exe 檢視類型庫:
Microsoft Web Browser。
2. 找到 Shell.Explorer.2 為 ProgID。
3. 介面 IWebBrowser2 中 Navigate 方法 ID 為 0x68(十進位 104),第一參數為 URL 字串,其餘可選。
public class OleView extends ViewPart {
public OleFrame frame; // 供 Action 存取
@Override public void createPartControl(Composite parent) {
frame = new OleFrame(parent, SWT.NONE);
// OleClientSite 與 OleAutomation 於 Action 中動態建立
}
@Override public void setFocus() { frame.setFocus(); }
}
public class OpenFileAction implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
@Override public void init(IWorkbenchWindow window) { this.window = window; }
@Override public void run(IAction action) {
IViewPart view = findView("使用Active X控件");
if (view instanceof OleView) {
OleFrame frame = ((OleView)view).frame;
// 1. 建立 ClientSite(嵌入瀏覽器控件)
OleClientSite client = new OleClientSite(frame, SWT.NONE, "Shell.Explorer.2");
client.doVerb(OLE.OLEIVERB_SHOW); // 啟用顯示
// 2. 取得自動化介面
OleAutomation automation = new OleAutomation(client);
// 3. 準備參數:URL
Variant url = new Variant("https://www.blogjava.net/");
// 4. 呼叫 Navigate (DISPID=104)
automation.invoke(104, new Variant[]{url});
}
}
private IViewPart findView(String title) {
for (IViewReference ref : window.getActivePage().getViewReferences()) {
IViewPart v = ref.getView(false);
if (title.equals(v.getTitle())) return v;
}
return null;
}
// dispose/selectionChanged 略
}
<extension point="org.eclipse.ui.views">
<view id="cn.blogjava.youxia.views.OleView"
class="cn.blogjava.youxia.views.OleView"
name="使用Active X控件"/>
</extension>
<extension point="org.eclipse.ui.actionSets">
<actionSet id="cn.blogjava.youxia.actionset" label="工具" visible="true">
<action class="cn.blogjava.youxia.actions.OpenFileAction"
id="openBrowserAction"
label="開啟瀏覽器"
menubarPath="browserMenu/additions"
toolbarPath="additions"
icon="icons/browser.gif"
tooltip="嵌入IE瀏覽器"
style="push"/>
</actionSet>
</extension>
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
layout.addView(OleView.ID, IPageLayout.LEFT, 0.5f, layout.getEditorArea());
}
}
org.eclipse.swt.ole.win32 依賴底層 COM,跨平台需改用 SWT Browser 控件(org.eclipse.swt.browser.Browser)。OleClientSite、OleAutomation、Variant 皆實作 dispose(),用畢必須釋放。OleEvent 監聽 ActiveX 事件(如 DocumentComplete、NavigateError)。SWT 的 OLE/ActiveX 支援讓 RCP 應用能直接復用 Windows 生態豐富的 COM 組件(Office、IE、Windows Media Player、第三方專業控件等)。核心流程為:OleFrame → OleClientSite(ProgID) → doVerb(SHOW) → OleAutomation.invoke(DISPID, Variant[])。搭配 OleView 工具查閱 DISPID,即可實現深度整合。