首先要說明的是 web上用activex是門被拋棄的技術。爲什麼這麼說,主要基於以下幾個原因:1.功能過於強大,強大到一旦安裝,他所具有的權限可以做任何事,極易被人利用做壞事(相信大家都有瀏覽網頁後莫名被安裝流氓軟件的經歷,當然流氓軟件利用的方式不止控件一種);2。通過網頁下載控件的中間過程受到操作系統、殺毒軟件、瀏覽器等多方面因素限制,這使你的控件產品未必能在所有用戶的電腦上正常使用;3。最噁心的一點,未簽名沒有正規安全證書的控件,在最新的瀏覽器上(IE7等)默認安全策略是直接屏蔽掉的,而你如果想要獲取這個信任,需要向微軟等少數單位申請,花費有多少?據說是每年4千多。。。
看了以上如果你還是想要知道步驟,如下:
一。用Vc++6.0新建工程裏的嚮導創建MFC activeX controlWizard,細節不說了,根據你控件需要了,略有不同,問題不會太大。
二。你控件代碼的主xx.cpp(非xxCtr.cpp)文件中添加安全接口函數,否則每次運行控件時IE都會給出安全提示,很煩!
#include "comcat.h"
#include "Objsafe.h"
// 本控件的CLSID,註冊表用
const GUID CDECL CLSID_SafeItem ={ 0x7AE7497B, 0xCAD8, 0x4E66,
{ 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };
// 版本控制
const WORD _wVerMajor = 1;
// 次版本號
const WORD _wVerMinor = 0;
/////////////////////////////////////////////////////////////////////
// CICCardApp::InitInstance - DLL initialization
BOOL CICCardApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
}
return bInit;
}
//////////////////////////////////////////////////////////////////////
// CICCardApp::ExitInstance - DLL termination
int CICCardApp::ExitInstance()
{
return COleControlModule::ExitInstance();
}
//////////////////////////////////////////////////////////////////////
// 創建組件種類
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR/Component Categories/{..catid...}
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
int len = wcslen(catDescription);
if (len>127)
len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated.
catinfo.szDescription[len] = '/0';
hr = pcr->RegisterCategories(1, &catinfo);
pcr->Release();
return hr;
}
// 註冊組件種類
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
// 卸載組件種類
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
// 標記控件初始化安全.
// 創建初始化安全組件種類
hr = CreateComponentCategory(CATID_SafeForInitializing,
L"Controls safely initializable from persistent data!");
if (FAILED(hr))
return hr;
// 註冊初始化安全
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// 標記控件腳本安全
// 創建腳本安全組件種類
hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");
if (FAILED(hr))
return hr;
// 註冊腳本安全組件種類
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;
return NOERROR;
}
//////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
// 刪除控件初始化安全入口.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// 刪除控件腳本安全入口
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;
//////////////////////////
return NOERROR;
}
三。添加自己的代碼到控件文件xxCtr.cpp中,這裏最好通過嚮導添加View->ClassWard->automation。
四。編譯生成你的xx.ocx控件文件,這個文件其實就是個DLL函數庫,只是後綴不同而已。
五。製作xx.inf文件用於之後的空間打包壓縮。紅色部分爲需要根據你自己情況修改的地方。
[version]
signature="$CHICAGO$"
AdvancedINF=1.0
[Add.Code]
xx.ocx=xx.ocx
[xx.ocx]
file-win32-x86=thiscab
clsid={351FC603-D784-4B8D-BA2C-33C212EC5BAA}
FileVersion=1,0,0,1
RegisterServer=yes
六。打包壓縮成xx.cab文件。你需要用到給控件簽名的一些工具:cabarc.exe、signcode.exe,另外你可能需要用於製作自己試驗證書的工具:makecert.exe、cert2spc.exe。
製作根證書MyCert.cer和私鑰myKey.PVK:
makecert -r -sv "myKey.PVK" -n CN="xx Electric Industry Co. Ltd." MyCert.cer
CERT2SPC MyOKIcert.cer MyOKIcert.spc
打包壓縮空間爲xx.cab:
cabarc -s 6144 n xx.cab xx.ocx xx.inf
數字簽名cab文件
雙擊signocode.exe文件,圖形化簽名,注意要通過自定義選擇自己的證書和私鑰而不是選擇系統已有的。
七。在你要用空間的Web上添加代碼:
<td colspan="2"><object id='t1' codeBase=/UserMode/xx.cab#version=1,0,0,1 classid='clsid:F3530445-A287-4A0B-AC3E-C4AF2B63EBA7' height=0 width=0 ></object></td>
八。調用控件內方法。通過javascript直接調用控件對象的方法就行了,比如調用空間中存在的一個download()方法:document.getElementByID("t1").download();
八。客戶端使用,其他人從網上下載到你的控件後,如果是Window XP系統的話,需要先導入證書爲可信任(詳細到Google上搜索導入證書,很容易),再安裝控件,之後才能用;而如果是Window2000用戶則只要安裝控件就可以使用了。
九。控件的刪除。Internet選項-〉設定-〉顯示對象,直接看到你的xx.cab文件,Del掉就行了,註冊表中信息會自動消除掉,當然你也可以直接到註冊表中刪除對應xx.inf中列出的鍵值的項。
十。升級。只要在源代碼中更改xx.rc文件中對應的那些1.0.0.1爲你的新版本號,並同時更改你調用控件的web上的版本號就可以了,下一次客戶訪問這個頁面時會自動提示安裝新控件,新控件會覆蓋就版本的控件。