首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Eclipse RCP 開發實戰(四):嵌入 ActiveX 控件

     編輯:Java 相關知識

前言

在 Windows 平台,SWT 提供 org.eclipse.swt.ole.win32 套件支援 OLE/ActiveX 嵌入。本文示範在 RCP 視圖中嵌入 Microsoft Web Browser 控件(Shell.Explorer.2),並透過 OleAutomation 呼叫 Navigate 方法載入網頁。

核心類別

  • OleFrame:ActiveX 容器,對應 SWT Composite。
  • OleClientSite:具體 ActiveX 實例,建構需 ProgID(如 Shell.Explorer.2)。
  • OleAutomation:自動化介面,用於呼叫方法、設定/取得屬性。
  • Variant:COM 變體類型,封裝基本型別傳遞給 ActiveX。

取得 ProgID 與方法 ID

使用 Visual Studio 自帶 OleView.exe 檢視類型庫:

    1. 開啟 OleView > View TypeLib > 選擇 Microsoft Web Browser。 2. 找到 Shell.Explorer.2 為 ProgID。 3. 介面 IWebBrowser2 中 Navigate 方法 ID 為 0x68(十進位 104),第一參數為 URL 字串,其餘可選。

視圖實作:建立 OleFrame

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(); }
}

Action 實作:動態建立瀏覽器並導航

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 略
}

plugin.xml 擴展點配置

<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>

Perspective 配置顯示視圖

public class Perspective implements IPerspectiveFactory {
    public void createInitialLayout(IPageLayout layout) {
        layout.addView(OleView.ID, IPageLayout.LEFT, 0.5f, layout.getEditorArea());
    }
}

注意事項與限制

  • 僅限 Windows:org.eclipse.swt.ole.win32 依賴底層 COM,跨平台需改用 SWT Browser 控件(org.eclipse.swt.browser.Browser)。
  • 資源釋放:OleClientSite、OleAutomation、Variant 皆實作 dispose(),用畢必須釋放。
  • 事件處理:可透過 OleEvent 監聽 ActiveX 事件(如 DocumentComplete、NavigateError)。
  • 安全性:嵌入 IE 控件受 IE 安全區域設定影響,信任站點需加入「信任的站點」區域。

總結

SWT 的 OLE/ActiveX 支援讓 RCP 應用能直接復用 Windows 生態豐富的 COM 組件(Office、IE、Windows Media Player、第三方專業控件等)。核心流程為:OleFrame → OleClientSite(ProgID) → doVerb(SHOW) → OleAutomation.invoke(DISPID, Variant[])。搭配 OleView 工具查閱 DISPID,即可實現深度整合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved