自從Microsoft公司於1996年推出ActiveX技術以來,ActiveX技術已得到了許多軟體公司的支援和響應,並紛紛在其產品中融入ActiveX技術。而作為ActiveX技術之一的ActiveX控制項也得到了迅猛的發展,不但各大軟體公司推出了不少ActiveX 控制項,ActiveX控制項更是得到一般開發人員的喜愛。那麼,什麼是ActiveX控制項呢?ActiveX控制項是一個動態連結程式庫,是作為基於COM伺服器進行操作的,並且可以嵌入在包容器宿主應用程式中,ActiveX控制項的前身就是OLE控制項。由於ActiveX控制項與開發平台無關,因此,在一種程式設計語言上開發的ActiveX控制項可以無須任何修改,即可在另一種程式設計語言中使用,其效果如同使用Windows通用控制項一樣。如:在VC++中開發的ActiveX控制項,不作任何修改即可應用於VB中。由此可見,通過使用ActiveX控制項即可實現快速小型的組件重用、實現代碼共用,從而提高編程效率。從上面亦可看出為何ActiveX控制項如此廣泛地受到開發人員的歡迎。
因為ActiveX控制項的可重用性,加上Internet的普及,ActiveX控制項得到了極大的發展,目前,從Internet上可以得到相當多的ActiveX控制項,而且品種繁多,所完成的任務幾乎無所不包。對普通開發人員來說,只要有耐心,都能從Internet上找到符合自己要求的ActiveX控制項。
從Internet下載的ActiveX控制項,或從其他途徑得到的ActiveX控制項,使用者應該怎樣做才能正確使用ActiveX控制項或將其應用於自己的程式中呢?一般來說,一個外來ActiveX控制項要在Windows中被正確使用,首先必須將控制項檔案(*.OCX)複製到硬碟中,然後將其在Windows中註冊,未在Windows中註冊過的ActiveX控制項是不能使用的。註冊ActiveX控制項一般來說有三種途徑:
1. 使用Regsvr32.exe程式對ActiveX控制項進行註冊;
2. 使用安裝程式製作軟體:InstallShield;
3. 在應用程式中加入註冊代碼。
上述方法適用範圍不同,各有各的優點,下面分別討論。
一、 使用Regsvr32.exe程式對ActiveX控制項進行註冊
對於未註冊過的ActiveX控制項可使用此軟體對其進行註冊,外來ActiveX控制項要應用到自己的程式中也必須進行註冊。該檔案位於Windows目錄的system子目錄下。使用方法如下:點擊“開始”→“運行”;在運行對話方塊中輸入以下命令:
regsvr32 < 檔案名稱 > 註冊一個ActiveX控制項
regsvr32 /u < 檔案名稱 > 解除某ActiveX控制項的註冊
我們使用一些帶ActiveX控制項的應用程式時,有時會出現不能啟動並執行情況,這有可能是其內建ActiveX控制項未註冊所至,這時不妨使用上述命令一試。另外,VC++使用者若對regsvr32.exe的編碼感興趣的話,可在VC++的線上說明中找到其原始碼。若使用VC++ 6.0,則在MSDN光碟片的sampleVC98MFCcontrols egsvr中。
二、 使用安裝程式製作軟體:InstallShield
使用regsvr32.exe來註冊ActiveX控制項雖然簡單,但需要使用者手工註冊,在不用時還得手工解除註冊,因此,這對一個應用程式來說並非好的解決方案。大型應用軟體一般都有一個安裝程式,在安裝程式中解決ActiveX控制項註冊是較為理想的一種方案。使用InstallShield可以製作出專業級的Setup,還可註冊其中的ActiveX控制項;而且,在以後攜載軟體時,自動登出掉以前註冊的ActiveX控制項。方法如下:
1. 啟動InstallShield,使用Project Wizard建立一個新的項目;
2. 建立一個“File Group”,將需要註冊的ActiveX控制項檔案放入此“File Group”中;
3. 將上述“File Group”的“Self-Registered”屬性設定成“Yes”。
上述步驟僅為製作Setup中設定自動註冊ActiveX控制項幾步,至於使用InstallShield怎樣製作一個完整的Setup不在本文討論範圍之中,請讀者自己參看有關書籍。
三、 在應用程式中加入註冊代碼
對於小型程式不宜採取第二種方法,較好的方法是在程式中嵌入註冊代碼,實現應用程式自註冊。其編程方法是:
1. 使用Windows API函數LoadLibrary載入ActiveX控制項;
2. 使用GetProcAddress函數擷取ActiveX控制項中註冊函數DllRegisterServer(登出函數為DllUnregisterServer)指標;
3. 調用註冊函數DllRegisterServer(或登出函數DllUnregisterServer)。
下面以VC++ 6.0編寫的RegActivex程式為例,介紹怎樣在程式中自動註冊(登出)ActiveX控制項。RegActivex的主體架構由VC++ 6.0的AppWizard自動產生,在其基礎上增加兩個功能表項目:“註冊ActiveX控制項”、“登出ActiveX控制項”。當選擇“註冊ActiveX控制項”菜單時,將對控制項toweratl.ocx(一個漢諾遊戲)進行註冊;當選擇“登出ActiveX控制項”菜單時,將解除控制項toweratl.ocx的註冊。
1. 使用VC++ 6.0建立一個單文檔的應用程式RegActivex,其他項目接受預設設定;
2. 給應用程式增加兩個功能表項目:“註冊ActiveX控制項”、“登出ActiveX控制項”,步驟如下:
① 單擊VC++ 6.0左邊視窗的“ResoureView”,雙擊MENU項目下的IDR_MAINFRAME以開啟菜單編輯器;
② 在菜單編輯器中,加入一個主菜單“註冊”,在“註冊”主菜單下加入兩個功能表項目:“註冊ActiveX控制項”、“登出ActiveX控制項”;
3. 給建立的功能表項目 “註冊ActiveX控制項” 和“登出ActiveX控制項”增加響應函數:
① 在資源編輯其中,雙擊MENU中的IDR_MAINFRAME開啟菜單編輯器,單擊“註冊ActiveX控制項”,按Ctrl+W開啟MFC Class Wizard;
② 雙擊Messages框中的COMMAND,給“註冊ActiveX控制項”功能表項目增加響應函數OnRegisterReg(),單擊右邊“Edit”按鈕給OnRegisterReg()函數增加如下代碼:
void CMainFrame::OnRegisterReg()
{
//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"))。
4. 編譯聯結上述程式,即可得一個可執行檔。另需注意的是:應將ActiveX控制項檔案toweratl.ocx複製到Windows的system目錄下。控制項檔案toweratl.ocx在微軟出版的《Visual C++ 6.0程式員指南》所附光碟片中可以找到。
5. 測試上述程式:運行《Visual C++ 6.0程式員指南》所附光碟片中的game2程式,若使用RegActivex註冊了toweratl.ocx控制項,則該程式可以正常運行;若使用RegActivex登出了toweratl.ocx控制項則game2不能運行。