首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

使用 VC6 實現 IE 工具列:ATL 專案、三大介面與註冊全流程

     編輯:關於VC++

前言

IE 工具列是運行在 IE 進程內的 COM 物件(In-proc Server),由 IE 被動載入並透過特定介面互動。本文記錄從建立 ATL 專案到實作 IObjectWithSite、IDeskBand、IInputObject 三大介面,並完成註冊的完整流程。

專案建立

  1. Visual C++ 6.0 → ATL COM AppWizard → 勾選「Dynamic Link Library」→ 完成。
  2. 專案屬性 → Linker → General → 輸出檔名設為 MyBand.dll(便於識別)。

核心介面實作

介面繼承鏈關鍵方法用途
IObjectWithSite-SetSite(IUnknown*), GetSiteIE 載入/卸載工具列時呼叫,傳遞 IWebBrowser2 指標
IOleWindow-GetWindow, ContextSensitiveHelp提供工具列視窗控制碼
IDockingWindowIOleWindowShowDW, CloseDW, ResizeBorderDW停靠視窗顯示/隱藏/調整邊框
IDeskBandIDockingWindowGetBandInfo回報工具列尺寸、標題、模式(如 DBIMF_VARIABLEHEIGHT)
IInputObject-UIActivateIO, HasFocusIO, TranslateAcceleratorIO焦點管理與快捷鍵轉譯

關鍵實作片段


// IObjectWithSite::SetSite
STDMETHODIMP CMyBand::SetSite(IUnknown* pUnkSite) {
    if (m_spSite) m_spSite->Release();
    m_spSite = pUnkSite;
    if (m_spSite) m_spSite->AddRef();

    // 建立工具列子視窗(建議先建一個子視窗再作為父視窗)
    if (pUnkSite && !m_hWndToolbar) {
        m_hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
            WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN | CCS_NODIVIDER,
            0,0,0,0, NULL, NULL, _Module.GetModuleInstance(), NULL);
        // 初始化按鈕、編輯框、下拉框等控制項...
    }
    return S_OK;
}

// IDeskBand::GetBandInfo
STDMETHODIMP CMyBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) {
    if (pdbi->dwMask & DBIM_MINSIZE)   pdbi->ptMinSize = { 100, 22 };
    if (pdbi->dwMask & DBIM_MAXSIZE)   pdbi->ptMaxSize = { -1, 22 };
    if (pdbi->dwMask & DBIM_INTEGRAL)  pdbi->ptIntegral = { 1, 1 };
    if (pdbi->dwMask & DBIM_ACTUAL)    pdbi->ptActual  = { 200, 22 };
    if (pdbi->dwMask & DBIM_TITLE)     lstrcpy(pdbi->wszTitle, L"My Toolbar");
    if (pdbi->dwMask & DBIM_MODEFLAGS) pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT;
    if (pdbi->dwMask & DBIM_BKCOLOR)   pdbi->crBkgnd = GetSysColor(COLOR_3DFACE);
    return S_OK;
}

視窗建立策略

  • 在 SetSite 中建立工具列視窗(CreateWindowEx),樣式含 WS_CHILD。
  • 建議先建一個隱形父視窗,再將工具列作為其子視窗,避免 Z-order 與訊息循環問題。
  • IOleWindow::GetWindow 回傳此工具列 HWND。

註冊與部署

  1. 編譯產生 MyBand.dll。
  2. 以管理員身分執行 regsvr32 MyBand.dll(或專案內建「註冊」目標)。
  3. 註冊表關鍵路徑(由 ATL 自動寫入):

HKCR\CLSID\{YOUR_GUID}              // 元件 CLSID
  InprocServer32 = "MyBand.dll"
  ThreadingModel = "Apartment"
HKCR\CLSID\{YOUR_GUID}\Implemented Categories\{00021492-0000-0000-C000-000000000046}  // CATID_DeskBand
HKLM\Software\Microsoft\Internet Explorer\Toolbar\{YOUR_GUID}  // 可選:預設顯示

驗證與除錯

  1. 開啟 IE → 檢視 → 工具列 → 勾選「My Toolbar」。
  2. 若未出現,檢查 regsvr32 是否成功、CATID_DeskBand 分類是否註冊。
  3. 除錯:專案屬性 → Debug → Executable for debug session 設為 C:\Program Files\Internet Explorer\iexplore.exe,設定斷點即可進入 SetSite 等入口。

遺留問題與改進方向

  • XP 視覺風格:需在 Manifest 中宣告 Common Controls 6.0 並處理 WM_THEMECHANGED。
  • 按鈕任意圖片/尺寸:工具列預設按鈕尺寸固定,需自繪或使用 TB_SETBUTTONSIZE + TB_REPLACEBITMAP 實現自定義。
  • 編輯框/下拉框焦點:需正確實作 IInputObject::TranslateAcceleratorIO 轉發 WM_KEYDOWN。
  • 總結

    IE 工具列開發核心在於正確實作 IObjectWithSite(生命週期)、IDeskBand(幾何屬性)、IInputObject(輸入焦點)三介面,並完成 DeskBand 分類註冊。本文提供的最小化實作可作為進一步功能擴展(搜尋框、下載管理、即時資訊等)的起點。

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