從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 不 能 運 行。