ActiveX控件註冊的幾種方法(源碼級的,值得看看)

           ActiveX 控 件 是 一 個 動 態 鏈 接 庫, 是 作 爲 基 於COM 服 務 器 進  行 操 作 的, 並 且 可 以 嵌 入 在 包 容 器 宿 主 應 用 程 序 中, ActiveX 控 件 的 前 身 就 是OLE 控 件。 由 於ActiveX 控 件 與 開 發 平  臺 無 關, 因 此, 在 一 種 編 程 語 言 上 開 發 的ActiveX 控 件 可 以 無 須 作 任 何 修 改, 即 可 在 另 一 種 編 程 語 言 中 使 用, 其  效 果 如 同 使 用 Windows 通 用 控 件 一 樣。 如: 在VC + + 中 開 發 的ActiveX 控 件, 不 作 任 何 修 改 即 可 應 用 於VB 中。 由 此 可  見, 通 過 使 用ActiveX 控 件 即 可 實 現 快 速 小 型 的 組 件 重 用 、 代 碼 共 享, 從 而 提 高 編 程 效 率。

 

         從Internet 下 載 的ActiveX 控 件, 或 從 其 他 途 徑 得 到 的 ActiveX 控 件, 用 戶 應 該 怎 樣 做 才 能 正 確 使 用 呢 ? 一 般 來  說, 一 個 外 來ActiveX 控 件 要 在Windows 中 被 正 確 使 用, 首 先

 必 須 將 控 件 文 件( *.OCX) 復 制 到 硬 盤 中, 然 後 將 其 在 Windows 中 注 冊, 未 在 Windows 中 注 冊 過 的ActiveX 控 件 是 不 能  使 用 的。 注 冊ActiveX 控 件 一 般 來 說 有 三 種 途 徑, 適 用 範 圍 不 同, 各 有 各 的 優 點, 下 面 分 別 討 論。  

一、 使 用Regsvr32.exe 程 序對ActiveX 控 件 進 行 注 冊  

        對 於 未 注 冊 過 的ActiveX 控 件 可 使 用 此 軟 件 對 其 進 行 注  冊, 外 來ActiveX 控 件 要 應 用 到 自 己 的 程 序 中 也 必 須 進 行  注 冊。 該 文 件 位 於Windows 目 錄 的system 子 目 錄 下。 使 用 方 法 如 下: 點 擊“ 開 始” →“ 運 行”; 在 運 行 對 話 框 中 輸 入以 下 命 令:

regsvr32  < 文 件 名 >   注 冊 一 個ActiveX 控 件

regsvr32 /u< 文 件 名 > 解 除 某ActiveX 控 件 的 注 冊

 

        我 們 使 用 一 些 帶ActiveX 控 件 的 應 用 程 序 時, 有 時 會 出  現 不 能 運 行 的 情 況, 這 有 可 能 是 其 自 帶ActiveX 控 件 未 注  冊 所 至, 這 時 不 妨 使 用 上 述 命 令 一 試。 另 外,VC + + 使 用 者 若 對regsvr32.exe 的 編 碼 感 興 趣 的 話, 可 在VC + + 的 聯  機 幫 助 中 找 到 其 源 代 碼。 若 使 用VC + + 6.0, 則 在MSDN 光 盤 的 /sample/VC98/MFC/controls/regsvr 中。  

二、 使 用 安 裝 程 序

制 作 軟 件:InstallShield  

            使 用regsvr32.exe 來 注 冊ActiveX 控 件 雖 然 簡 單, 但 需 要 用  戶 手 工 注 冊, 在 不 用 時 還 得 手 工 解 除 注 冊, 因 此, 這 對  一 個 應 用 程 序 來 說 並 非 好 的 解 決 方 案。 大 型 應 用 軟 件 一 般 都 有 一 個 安 裝 程 序, 在 安 裝 程 序 中 解 決ActiveX 控 件 注 冊 是 較 爲 理 想 的 一 種 方 案。 使 用InstallShield 可 以 制 作 出 專 業 級 的Setup, 還 可 注 冊 其 中 的ActiveX 控 件; 而 且, 在 以 後 攜 載 軟 件 時, 自 動 注 銷 掉 以 前 注 冊 的ActiveX 控 件。 方  法 如 下:

啓 動InstallShield, 使 用Project Wizard 建 立 一 個 新 的 項 目;

新 建 一 個“File Group”, 將 需 要 注 冊 的ActiveX 控 件 文 件 放 入  此“File Group” 中;

將 上 述“File Group” 的“Self -Registered” 屬 性 設 置 成“Yes”。  

         上 述 步 驟 僅 爲 制 作Setup 中 設 置 自 動 注 冊 ActiveX 控 件 幾  步, 至 於 使 用InstallShield 怎 樣 制 作 一 個 完 整 的Setup 不 在 本 文 討 論 範 圍 之 中, 請 讀 者 自 己 參 看 有 關 書 籍。 

三、 在 應 用 程 序 中 加 入 注 冊 代 碼  

           對 於 小 型 程 序 不 宜 採 取 第 二 種 方 法, 較 好 的 方 法 是 在 程 序 中 嵌 入 注 冊 代 碼, 實 現 應 用 程 序 自 注 冊。 其 編 程  方 法 是:

使 用Windows API 函 數LoadLibrary 載 入ActiveX 控 件;

使 用GetProcAddress 函 數 獲 取ActiveX 控 件 中 注 冊 函 數

DllRegisterServer ( 注 銷 函 數 爲DllUnregisterServer) 指 針;

調 用 注 冊 函 數DllRegisterServer( 或 注 銷 函 數 DllUnregisterServer)。

          下 面 以VC + + 6.0 編 寫 的RegActivex 程 序 爲 例, 介 紹 怎 樣 在 程 序 中 自 動 注 冊( 注 銷)ActiveX 控 件。RegActivex 的 主 體 框 架 由VC + + 6.0 的AppWizard 自 動 產 生, 在 其 基 礎 上 增 加 兩  個 菜 單 項:“ 注 冊ActiveX 控 件”、“ 注 銷ActiveX 控 件”。 當 選 擇“ 注 冊 ActiveX 控 件” 菜 單 時, 將 對 控 件toweratl.ocx( 一 個  漢 諾 遊 戲) 進 行 注 冊; 當 選 擇“ 注 銷ActiveX 控 件” 菜 單 時, 將 解 除 控 件toweratl.ocx 的 注 冊。  

         使 用VC + + 6.0 建 立 一 個 單 文 檔 的 應 用 程 序RegActivex, 其 他 項 目 接 受 默 認 設 置;

給 應 用 程 序 增 加 兩 個 菜 單 項:“ 注 冊ActiveX 控 件”、“ 注 銷ActiveX 控 件”, 步 驟 如 下:

單 擊VC + + 6.0 左 邊 窗 口 的“ResoureView”, 雙 擊MENU 項 目 下 的IDR_MAINFRAME 以 打 開 菜 單 編 輯 器;在 菜 單 編 輯 器 中, 加 入 一 個 主 菜 單“ 注 冊”, 在“ 注 冊” 主 菜 單 下 加 入 兩 個 菜 單 項:“ 注 冊ActiveX 控 件”、“ 注 銷ActiveX 控 件”;給 新 建 的 菜 單 項 “ 注 冊ActiveX 控 件” 和“ 注 銷ActiveX 控 件”  增 加 響 應 函 數: 在 資 源 編 輯 器 中, 雙 擊MENU 中 的IDR_MAINFRAME 打 開 菜 單 編 輯  器, 單 擊“ 注 冊ActiveX 控 件”, 按Ctrl +W 打 開MFC Class Wizard;  

雙 擊Messages 框 中 的COMMAND, 給“ 注 冊ActiveX 控 件” 菜 單 項 增 加 響 應 函 數OnRegisterReg(), 單 擊 右 邊“Edit” 按 鈕, 給 OnRegisterReg() 函 數 增 加 如 下 代 碼:

void CMainFrame::OnRegisterReg()

  {

          file://ActiveX 控 件 的 路 徑 及 文 件 名

          LPCTSTR pszDllName=“toweratl.ocx";

          // 裝 載ActiveX 控 件

          HINSTANCE hLib = LoadLibrary(pszDllName);

          if (hLib < (HINSTANCE)HINSTANCE_ERROR)

          {

                  MessageBox(“ 不 能 載 入Dll 文 件!",  “ 結 果",MB_OK);

                 return;

         }  

        // 獲 取 注 冊 函 數DllRegisterServer 地 址

       FARPROC lpDllEntryPoint;

       lpDllEntryPoint = GetProcAddress

       (hLib,_T(“DllRegisterServer"));

       // 調 用 注 冊 函 數DllRegisterServer

      if(lpDllEntryPoint!=NULL)

      {

              if(FAILED(( *lpDllEntryPoint)()))

             {

                       MessageBox(“ 調 用DllRegisterServer 失 敗 !",  “ 結 果",MB_OK);

                      FreeLibrary(hLib);

                      return;

             }

             MessageBox(“ 注 冊 成 功",“ 結 果",MB_OK);

      }

      else

      MessageBox(“ 調 用DllRegisterServer 失 敗 !", “ 結 果",MB_OK);

}

 

       “ 注 銷ActiveX 控 件” 菜 單 項 響 應 函 數 的 編 寫 方 法 同 上, 代 碼 也 相 似, 只 是 將 “lpDllEntryPoint=GetProcAddress(hLib,_T(“ DllRegisterServer"));” 改 成:

  lpDllEntryPoint = GetProcAddress(hLib,_T (“DllUnregisterServer"))。 

          編 譯 聯 接 上 述 程 序, 即 可 得 一 個 可 執 行 文 件。 另 需 注 意 的 是: 應 將ActiveX 控 件 文 件toweratl.ocx 復 制 到Windows 的system  目 錄 下。 控 件 文 件toweratl.ocx 在 微 軟 出 版 的《Visual C + +  6.0 程 序 員 指 南》 所 附 光 盤 中 可 以 找 到。

       測 試 上 述 程 序: 運 行《Visual C + + 6.0 程 序 員 指 南》 所 附光 盤 中 的game2 程 序, 若 使 用RegActivex 注 冊 了toweratl.ocx 控 件 , 則 該 程 序 可 以 正 常 運 行; 若 使 用RegActivex 注 銷 了 toweratl.ocx 控 件 則game2 不 能 運 行。

發佈了23 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章