web上用Activex控件開發步驟

首先要說明的是 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上的版本號就可以了,下一次客戶訪問這個頁面時會自動提示安裝新控件,新控件會覆蓋就版本的控件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章