一篇介绍VC开发OCX的文章,写得太棒了!!!
From: http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html
?
VC2005從開發(fā)MFC ActiveX ocx控件到發(fā)布到.net網(wǎng)站的全部過程
開篇語:最近在弄ocx控件發(fā)布到asp.net網(wǎng)站上使用,就是用戶在使用過程中,自動(dòng)下載安裝ocx控件。(此文章也是總結(jié)了網(wǎng)上好多人寫的文章,我只是匯總一下,加上部分自己的東西,在這里感謝所有在網(wǎng)上發(fā)表相關(guān)內(nèi)容的朋友們。)
ActiveX控 件用于Web的過程是將控件嵌入主頁中,用戶通過瀏覽器訪問該主頁時(shí),將主頁中的控件下載,并在用戶機(jī)器上注冊,以后就可在用戶的瀏覽器上運(yùn)行。控件下載 一次后就駐留在用戶本地機(jī)器上,下次再訪問相同的主頁時(shí),可不再下載該控件,而是直接運(yùn)行用戶本地的控件。這里控件容器就是瀏覽器,用戶不需要通過瀏覽器 調(diào)用控件的屬性或方法。因此,開發(fā)面向Web的ActiveX控件比開發(fā)桌面的控件還要簡單些,所復(fù)雜的是如何將該控件很好地嵌入主頁,使用戶能正常瀏覽。下面介紹這個(gè)問題。
一.??????? 創(chuàng)建MFC ActiveX項(xiàng)目
1.?????? 打開VS2005新建MFC項(xiàng)目。這里我們?nèi)∶麨椤?/span>ActiveXDemo”。
?
2.?????? 輸入項(xiàng)目名稱為“ActiveXDemo”和項(xiàng)目位置。點(diǎn)擊“確定”按鈕,打開向?qū)υ捒颉?/span>
WoSign 免費(fèi)提供的時(shí)間戳服務(wù)URL: http://timestamp.wosign.com/timestamp
???? 時(shí)間戳服務(wù)非常重要,添加時(shí)間戳后,即使您的代碼簽名證書已經(jīng)過期,但由于您的代碼是在證書有效期內(nèi)簽名的,則時(shí)間戳服務(wù)保證了此代碼仍然可信,最終用戶仍然可以放心下載,使得即使代碼簽名證書已經(jīng)過期,您也無需重簽和重新發(fā)布已經(jīng)簽名的代碼。
?
3.?????? 選擇“控件設(shè)置”選項(xiàng)卡,具體設(shè)置可參考上圖。其它選項(xiàng)卡為默認(rèn)設(shè)置。最后點(diǎn)擊“完成”按鈕保存設(shè)置。
?
二.??????? 添加控件方法
VC2005會(huì)為我們自動(dòng)創(chuàng)建好MFC ActiveX程序框架,我們只要給該ActiveX控件添加方法即可。現(xiàn)在我們給控件添加一個(gè)“AddFun”方法,這個(gè)方法是將兩個(gè)數(shù)相加并返回結(jié)果。
1.?????? 點(diǎn)擊“視圖”,打開“類視圖”窗口。
2.?????? 展開“ActiveXDemoLib”項(xiàng),選中“_DActiveXDemo”項(xiàng)。點(diǎn)擊鼠標(biāo)右鍵,選擇“添加”下的“添加方法”。
?
3.?????? 打開添加方法向?qū)Т翱凇R驗(yàn)槲覀兪翘砑右粋€(gè)加法方法,所以我們設(shè)置的返回類型為LONG型,方法名設(shè)為AddFun,添加兩個(gè)LONG類型參數(shù)Add1,Add2。
?
?
4.?????? 其它為默認(rèn)設(shè)置,點(diǎn)擊“完成”按鈕完成添加方法。接下來我們打開“解決方案資源管理器”打開“ActiveXDemoCtrl.cpp”文件。
5.?????? 打開代碼視圖,我們會(huì)發(fā)現(xiàn)VC2005已經(jīng)為我們添加了一個(gè)“AddFun”方法,我們在方法內(nèi)添加“return Add1 + Add2;”語句。
?
?三、MFC Activex 安全問題:
1、在默認(rèn)環(huán)境下,編譯的MFC Activex控件,只能在本地代碼中運(yùn)行,即在http://localhost/xxx/xxx.htm中執(zhí)行,而在http://127.0.0.1/xxx/xxx.htm中提示無相關(guān)屬性,需要設(shè)置其初始化和腳本運(yùn)行的安全性
ActiveX在遠(yuǎn)程IE頁面上執(zhí)行,需要實(shí)現(xiàn)安全接口。
在ATL寫的ActiveX中,用IObjectSafety。
http://support.microsoft.com/kb/168371/en-us
在MFC寫的ActiveX中,直接修改注冊表。
http://support.microsoft.com/kb/161873/en-us
mfc實(shí)現(xiàn)的ocx,要在app實(shí)現(xiàn)文件中包括兩個(gè)文件:
?在ActivexDemo.cpp 文件中實(shí)現(xiàn)以下方法
?
代碼 #include? " stdafx.h "#include? " ActivexDemo.h "
#include? < comcat.h > ????
#include? < objsafe.h >
#ifdef?_DEBUG
#define ?new?DEBUG_NEW
#endif
CActivexDemoApp?theApp;
const ?GUID?CDECL?BASED_CODE?_tlid? =
????????{? 0x344B8576 ,? 0xAB2C ,? 0x4D38 ,?{? 0xAE ,? 0x7 ,? 0x73 ,? 0x74 ,? 0x22 ,? 0x89 ,? 0x72 ,? 0xEA ?}?};
const ?WORD?_wVerMajor? = ? 1 ;
const ?WORD?_wVerMinor? = ? 0 ;
// ?CActivexDemoApp::InitInstance?-?DLL?初始化
BOOL?CActivexDemoApp::InitInstance()
{
????BOOL?bInit? = ?COleControlModule::InitInstance();
???? if ?(bInit)
????{
???????? // ?TODO:?在此添加您自己的模塊初始化代碼。
????}
???? return ?bInit;
}
// ?CActivexDemoApp::ExitInstance?-?DLL?終止
int ?CActivexDemoApp::ExitInstance()
{
???? // ?TODO:?在此添加您自己的模塊終止代碼。
???? return ?COleControlModule::ExitInstance();
}
// ?創(chuàng)建組件種類????
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;????
}????
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);????
???? // ?標(biāo)記控件初始化安全.????
???? // ?創(chuàng)建初始化安全組件種類????
????hr? = ?CreateComponentCategory(CATID_SafeForInitializing,?L " Controls?safely?initializable?from?persistent?data! " );????
???? if ?(FAILED(hr))? return ?hr;????
???? // ?注冊初始化安全????
????hr? = ?RegisterCLSIDInCategory(BASED_CODE?_tlid?,?CATID_SafeForInitializing);????
???? if ?(FAILED(hr))? return ?hr;????
???? // ?標(biāo)記控件腳本安全????
???? // ?創(chuàng)建腳本安全組件種類????
????hr? = ?CreateComponentCategory(CATID_SafeForScripting,?L " Controls?safely?scriptable! " );????
???? if ?(FAILED(hr))? return ?hr;????
???? // ?注冊腳本安全組件種類????
????hr? = ?RegisterCLSIDInCategory(BASED_CODE?_tlid?,?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(BASED_CODE?_tlid?,?CATID_SafeForInitializing);????
???? if ?(FAILED(hr))? return ?hr;????
???? // ?刪除控件腳本安全入口????
????hr = UnRegisterCLSIDInCategory(BASED_CODE?_tlid?,?CATID_SafeForScripting);????
???? if ?(FAILED(hr))? return ?hr;????
???? return ?NOERROR;????
}??
?
現(xiàn)在控件就可以在自注冊時(shí)就注冊為安全控件了。
2、設(shè)置項(xiàng)目屬性 將配置類型設(shè)置成靜態(tài)庫(.lib)
?
3、?????? 最后生成項(xiàng)目,ocx控件就產(chǎn)生了。?
?
?ActiveX打包與發(fā)布
在VS2005或VS2008安裝后發(fā)現(xiàn)路徑**VC7\Common7\Tools\Bin\下有許多小工具,我對帶有Cert的文件比較感興趣。經(jīng)過研究,發(fā)現(xiàn)是有關(guān)證書和簽名的,當(dāng)然,該證書未被證書認(rèn)證機(jī)構(gòu)認(rèn)可。下面列出這些工具和我的使用心得。
1。Makecert.exe ---證書創(chuàng)建工具
2。Cert2Spc.exe ---發(fā)行者證書測試工具
3。Signcode.exe ---文件簽名工具(VS2008帶的是signtool)
一、ActiveX發(fā)布步驟
在這里簡單說明下,打包activeX需要制作證書,具體用到makecert 、cert2spc 、signtool 這三個(gè)VS提供的工具,工具在VS文件夾里面,以下制作過程需要在工具所在的文件夾下完成!
1、單擊"開始"-->"運(yùn)行(R)"-->輸入"cmd"-->回車-->進(jìn)入到操作的控件所在的目錄(需要將上面所說的工具,和ocx控件放到一個(gè)文件夾下);
2、創(chuàng)建PVK文件(私人密匙文件),在命令行中輸入"makecert -sk demo demo.pvk -n CN=XXXXXXX公司",然后回車;
sk-表示主題的密鑰容器位置,ss-主題的證書存儲(chǔ)名稱, n-證書頒發(fā)對象,r-證書存儲(chǔ)位置;
3、創(chuàng)建CER文件(公司證書),在命令行中輸入"makecert -sk demo.pvk demo.cer",然后回車,如圖8所示,若出現(xiàn)"Successed"提示,則會(huì)在E:\ demo目錄下生成demo.cer文件;
sk-表示主題的密鑰容器位置,is-頒發(fā)者的證書存儲(chǔ)名稱, n-證書頒發(fā)對象,ic-頒發(fā)者的證書存儲(chǔ)位置,-$-授權(quán)范圍(用于代碼簽名);
4、創(chuàng)建SPC測試軟件出版商證明書,在命令行中輸入"cert2spc demo.cer demo.spc",然后回車;
5、創(chuàng)建INF文件,用記錄本編輯以下信息:
?
代碼 [ version ] ????signature = " $CHICAGO$ "
AdvancedINF = 2.0
[ Add.Code ]
ActivexDemo.ocx = ActivexDemo.ocx
[ ActivexDemo.ocx ]
file-win32-x86 = thiscab????
// 告訴ie到哪里去得到這個(gè)dll,file一共包括三個(gè)部分,第一部分是file,這個(gè)永遠(yuǎn)都是這樣的(至少目前來說);第二部分告訴聲明支持的 OS,win32表示windows,mac就是蘋果MAC??OX了;第三部分是CPU類型,比如說 x86、??ppc??(Power??PC)、??mips或者alpha了???
//其中“thiscab”是一個(gè)關(guān)鍵字,表示?CAB?包含此?DLL,也可通過指定一條絕對或相對路徑,從一個(gè)?HTTP?位置下載所需的?DLL,???
例如:??file-win32-x86 = http://www.mysite.com/mydir/NEEDED.DLL???
RegisterServer = yes????
clsid = { 468E4531 -F890-47EC- 8368 -3BDA4448FF08}????
//“clsid”是將要安裝的控件的?CLSID??
DestDir = 11 ????
// 它的值是dll將要存到本地硬盤的位置,如果它的值是10,則將dll放到\Windows或者\(yùn)WinNT下;如果是11,則放到\Windows \System或者\(yùn)WinNT\System32下;如果未指定任何?DestDir(典型情況),則代碼安裝在固定的?OCCACHE?目錄中。??
FileVersion = 1 , 0 , 0 , 1
//說明了atl90.dll的版本號(hào)???
??
6、創(chuàng)建CAB文件,在命令行中輸入"cabarc -s 6144 n demo.cab atl90.dll Polygon.dll demo.inf",-s 選項(xiàng)表示在壓縮文件中保留用于代碼簽名的空間,n命令指定希望創(chuàng)建 CAB 文件,然后回車;
7、使用Code Signing Wizard簽署一個(gè)CAB文件,在控制臺(tái)輸入signtool signwizard 進(jìn)入到signtool窗體中;
8、單擊"下一步(N)"按鈕,選擇要進(jìn)行數(shù)字簽名的且已做成CAB包的文件demo.cab文件;
9、選擇好CAB包后單擊"下一步(N)"按鈕,在選擇想要的簽名類型里選擇"自定議(C)"并單擊"下一步(N)"按鈕;
10、接下來單擊"從文件選擇(F)"按鈕,選擇剛剛制作的demo.cer;
11、在單擊"下一步(N)",然后選擇"CSP中的私鑰(K)";
13、在"證書路徑中的證書"中選擇"證書路徑中的所有證書,包括根證書(C)",在"其它證書(可選)"中選擇"包括在以下PKCS #7 證書(.p7b)文件中的證書(P):",并單擊"瀏覽(R)..."按鈕選擇demo.spc文件,選擇完后單擊"下一步(N)"按鈕;
14、接下來在彈出的"數(shù)據(jù)描述"窗口中輸入公司的名稱和網(wǎng)址并單擊"下一步(N)"按鈕;
15、現(xiàn)大部份工作都已完成,在接下來的一步當(dāng)中是可選的操作,其作用只是為CAB加入時(shí)間戳,此步驟完全可以不做,VeriSign:? http://timestamp.verisign.com/scripts/timstamp.dll;
16、完成,單擊"下一步(N)"按鈕便可來到數(shù)字簽名向?qū)У淖詈笠徊?#xff0c;即操作總覽,如圖26所示,單擊"完成"按鈕便可大功告成;
?
?
下面是微軟代碼簽名證書(.pvk/.spc)簽名指南的演示
?
?
本使用指南演示如何使用WoSign代碼簽名證書來給微軟代碼簽名,Thawte和VeriSign代碼簽名證書也是使用同樣方法,只是使用不同的時(shí)間戳URL。
???? 用戶在在線申請代碼簽名證書時(shí)會(huì)生成證書私鑰文件,如:myCert.pvk,而代碼簽名證書成功頒發(fā)后的證書文件為公鑰文件, 如:myCert.spc,又稱:軟件發(fā)行證書(Software Publishing Certificate) 。 代碼簽名證書一般都是采用公鑰和私鑰分離的兩個(gè)文件方式,適合于 DOS 命令行方式的代碼簽名。如果您您希望把代碼簽名證書導(dǎo)入到Windows證書存儲(chǔ)區(qū)中,從而簡化簽名操作,請參考:不同證書格式轉(zhuǎn)換指南。
???? WoSign代碼簽名證書的根證書鏈為: UTN-USERFirst-Object - WoSign Code Signing Authority
??? 使用微軟的 SignCode.exe 就可以對微軟的代碼進(jìn)行簽名,如果您沒有此文件,點(diǎn)擊 這里 下載。 Signcode.exe 可以使用 DOS 命令行方式實(shí)現(xiàn)簽名,我們推薦用戶使用數(shù)字簽名向?qū)Х绞?#xff0c;簡單方便。請注意:如果您開發(fā)的ActiveX為IE加載項(xiàng),請先數(shù)字簽名每個(gè)CAB文件中的.dll和.ocx等文件,再把這些文件打包成.cab文件后再數(shù)字簽名.cab文件,以確保所有IE加載項(xiàng)都被IE驗(yàn)證和信任,否則會(huì)顯示“未驗(yàn)證”而可能影響正常運(yùn)行。
??? 具體簽名向?qū)н^程如下:
???? (1) 運(yùn)行 Signcode.exe , 要求您選擇需要簽名的文件,支持:可執(zhí)行文件 (*.exe; *.dll; *.ocx) ; Cabinet 打包文件 (*.cab) 和目錄文件 (*.cat) ,如下圖 1 所示 ( 如: TestSign.cab) ,請注意:如果簽名的文件已經(jīng)有數(shù)字簽名,則會(huì)被新的簽名覆蓋:
(2) 點(diǎn)擊“下一步”后,如下圖 2 所示,會(huì)要求您選擇“簽名類型”,缺省的“典型”簽名類型;請選擇“自定義” 簽名類型:
?(3) 如下圖 3 所示,點(diǎn)擊“從文件選擇”簽名證書 ( 公鑰文件 ),如: WotoneCS.spc :
?? (4) 點(diǎn)擊“下一步”后,如下圖 4 所示,會(huì)要求您選擇私鑰文件,如: WotoneCS.pvk ,其他參數(shù)不用動(dòng):
? (5) 點(diǎn)擊“下一步”后,如下圖 5 所示,會(huì)提示要求輸入私鑰密碼:
?? (6) 點(diǎn)擊“下一步”后,如下圖 6 所示,會(huì)提示要求選擇散列算法 ( 摘要算法、縮微圖算法 ) ,缺省為 sha1 ,也可以選 md5 :
(7) 點(diǎn)擊“下一步”后,如下圖 7 所示,選擇哪些證書包括到數(shù)字簽名中,直接點(diǎn)擊“下一步”即可,即選擇缺省的包括根證書:
(8) 如下圖 8 所示,要求填寫該簽名代碼的功能描述,推薦一定要認(rèn)真填寫,因?yàn)榇诵畔?huì)在最終用戶下載此代碼時(shí)顯示,有助于最終用戶了解此代碼的功能以確定是否下載安 裝。第一行“描述”是指此代碼的功能文字描述,第二行“ Web 位置”則讓最終用戶點(diǎn)擊文字描述來詳細(xì)了解此代碼的功能和使用方法等,本演示中的“ Web 位置”為WoTrust代碼簽名證書簡介頁面:
?(9) 點(diǎn)擊“下一步”后,如下圖 9 所示,選中“將時(shí)間戳添加到數(shù)據(jù)中”,請使用:
?
?
WoSign 免費(fèi)提供的時(shí)間戳服務(wù)URL: http://timestamp.wosign.com/timestamp
???? 時(shí)間戳服務(wù)非常重要,添加時(shí)間戳后,即使您的代碼簽名證書已經(jīng)過期,但由于您的代碼是在證書有效期內(nèi)簽名的,則時(shí)間戳服務(wù)保證了此代碼仍然可信,最終用戶仍然可以放心下載,使得即使代碼簽名證書已經(jīng)過期,您也無需重簽和重新發(fā)布已經(jīng)簽名的代碼。
(10) 點(diǎn)擊“下一步”后,如下圖 10 所示,會(huì)提示已經(jīng)完成數(shù)字簽名向?qū)?#xff0c;點(diǎn)擊“完成”后還會(huì)提示您輸入私鑰密碼,就完成代碼簽名證書的代碼簽名。
(11) 現(xiàn)在,需要使用 chktrust.exe 來查驗(yàn)已經(jīng)簽名的代碼, chktrust.exe 文件已經(jīng)打包在 signtool.rar 中。 進(jìn)入 DOS 命令提示符,并進(jìn)入已經(jīng)簽名的文件所在目錄 ( 如: d:\sign\TestCA.cab) ,鍵入命令: chktrust testcs.cab ,則會(huì)顯示實(shí)際應(yīng)用時(shí)在 IE 瀏覽器下載頁面的情況,如下圖 11 所示,對于Win XP操作系統(tǒng),會(huì)顯示軟件名稱和發(fā)行者名稱,其中軟件名稱就是您在第(8)步輸入的描述,點(diǎn)擊此名稱就鏈接到您在第(8)步填寫的網(wǎng)址,而點(diǎn)擊發(fā)行者名 稱,則會(huì)顯示您的簽名信息和時(shí)間戳信息。對于Win2000操作系統(tǒng),則稍有不同,第 1 行的紅線部分就是時(shí)間戳記錄的簽名時(shí)的本地時(shí)間,請注意:此時(shí)間不是取簽名電腦的時(shí)間,而是提供時(shí)間戳服務(wù)的服務(wù)器計(jì)算出來的簽名電腦設(shè)置的所在時(shí)區(qū)的本 地時(shí)間。第 1 行藍(lán)色文字就是在第 8 步中輸入的描述文字,點(diǎn)擊此藍(lán)色文字就可以訪問在第 8 步中輸入的 Web 描述頁面。第 2 行藍(lán)色文字則為該代碼的發(fā)行者,也就是代碼簽名證書的申請者(擁有者)( 如:深圳市沃通電子商務(wù)服務(wù)有限公司) ,點(diǎn)擊可以查看證書的詳細(xì)信息;第 2 行有紅色下劃線部分顯示“發(fā)行商可靠性由 WoSign Code Signing Authority 驗(yàn)證 ”就是此代碼簽名證書的證書頒發(fā)者。
12) 點(diǎn)擊“是”或“運(yùn)行”,則會(huì)提示“ TestSign.cab: Succeeded ”表示代碼 TestSign.cab 簽名驗(yàn)證有效,可以放到網(wǎng)站上了。請注意:簽名后的CAB文件放到網(wǎng)站上需要使用 object 方式。
請注意:不能僅簽名CAB文件,CAB包中所有DLL文件都要先簽名后再打包,再簽名CAB文件,否則IE瀏覽器會(huì)顯示為“未驗(yàn)證的發(fā)行者”而影響正常使用,甚至殺毒軟件會(huì)認(rèn)為是毒而被刪除!如下圖所示的實(shí)際案例:
?
?
在Web頁中加入ActiveX 控件
在修改了IE的安全設(shè)置后,依然不能調(diào)用控件的方法,需要將訪問的站點(diǎn)設(shè)置為“受信站點(diǎn)”,則方能正常使用控件
在<html> 和<head>之間插入
<!-- saved from url=(0017)http://localhost/ -->
則在IE窗口上方不會(huì)彈出黃色提示條 。
在HTML頁面中使用ActiveX控件包含三個(gè)基本操作:將控件放入HTML中;將該控件下載給用戶;在用戶機(jī)器上安裝該控件。如果只是針對IE用戶,在HTML中插入ActiveX控件就比較簡單;如果同時(shí)兼顧IE和Netscape用戶,則要做更多工作。大家知道,HTML文件由文本和各種標(biāo)志(tags)組成,ActiveX 控件對于IE在HTML中的標(biāo)志是<OBJECT>,該標(biāo)記有幾個(gè)重要的參數(shù)特性,它們是:
1.ID:為控件提供一個(gè)標(biāo)識(shí)名稱,為HTML代碼提供一種訪問該控件的方式。
2.CLASSID:是該控件唯一的UUID,告訴IE裝入哪個(gè)對象。如果使用已經(jīng)開發(fā)好的控件,它的CLASSID可以通過調(diào)用Win95或NT下的應(yīng) 用Regedit來查找。從開始菜單中運(yùn)行該程序,展開HKEY_CLASSES_ROOT項(xiàng),可以看到按字母順序排列的注冊表,找到需要使用的控件名, 例如WClnt,展開時(shí)可看到一個(gè)CLSID文件夾,里面就是該控件的CLASSID。
如果是自己用VC開發(fā)控件,該UUID可以在ActiveX控件項(xiàng)目中的ODL(對象描述庫)文件中找到;通過查看控件的類信息注釋來定位特定控件的UUID,例如,要找到CMyControl控件的UUID,則需要找到以下代碼:
// Class information for CMyControl
[uuid (051C4748-1262-11D2-87C1-00A024D948FB),
licensed,
helpstring(“CmyControl Control”), control ]
uuid后面括號(hào)中的內(nèi)容就是該控件的UUID。
3.CODEBASE:如果在用戶機(jī)器上沒有控件的當(dāng)前版本,該參數(shù)告訴用戶瀏覽器在哪里可找到要下載的控件和最新版本號(hào).當(dāng)控件作了修改后,可以更改版本號(hào)強(qiáng)制用戶重新下載。
4.PARAM:該標(biāo)記用于設(shè)置控件的初始屬性值,它有兩個(gè)特性:Name和Value,即屬性名稱和屬性值。
此外還有一些標(biāo)記,如:Width表示該控件所占的寬度,Height表示高度等,總體來說,這樣一個(gè)插入控件的HTML代碼和插入Java Applet的HTML代碼非常相似。
下面是一個(gè)嵌有ActiveX控件的HTML代碼示例:
ID=“CMyControl”
CLASSID=“clsid:051C4748-1262-11D2-87C1-00A024D948FB ”
CODEBASE=“http://www.mysite.com.cn/ocxdir/mycontrol.ocx#version=1,0,0,1”
WIDTH=400
HEIGHT=200
ALIGN=center
HSPACE=0
VSPACE=0
>
如果希望控件還 能在Netscape中運(yùn)行,除了Netscape需加裝插件外,HTML也要加一些附加標(biāo)記,下面的例子中EMBED段就是為Netscape加上的。 如果使用MFC開發(fā)OCX控件,則少數(shù)用戶第一次訪問時(shí)除了下載OCX文件外,還要下載相應(yīng)的MFC DLL,下載量變大,這時(shí)可將相關(guān)文件在服務(wù)器端打包成可以在客戶端自解壓安裝的CAB文件。經(jīng)過修改后的HTML代碼段如下:
<ALIGN=“CENTER” CLASSID=“clsid:
7BCA18C6-2178-11D2-87C1-00A024D948FB”
WIDTH=“1200” HEIGHT=“900” ID=“marquee”
CODEBASE=“http://218.168.188.188/scadaweb/
WClnt.cab#version=1,0,0,1”>
<EMBED ALIGN=“CENTER”CLASSID=“clsid:7BCA18C6- 2178-11D2-87C1-00A024D948FB”
WIDTH=“1200” HEIGHT=“900” ID=“marqueequot;”
CODEBASE=“http://218.168.188.188/scadaweb/
WClnt.OCX#version=1,0,0,1”
TYPE=“application/oleobject” >
?
?
?
?
實(shí)時(shí)動(dòng)態(tài)頁面的實(shí)現(xiàn)方案
對實(shí)時(shí)動(dòng)態(tài)頁面的要求多產(chǎn)生于一些要求自動(dòng)更新實(shí)時(shí)數(shù)據(jù)的應(yīng)用中,如電網(wǎng)監(jiān)控、股市監(jiān)測等。具體要求是:用戶只需選取希望瀏覽的圖表,但無需介入操作,該圖表就能根據(jù)實(shí)時(shí)數(shù)據(jù)不斷更新,用戶總能觀察到最新情況。
要實(shí)現(xiàn)上述功 能,結(jié)構(gòu)上有兩種方案:一種是設(shè)置一個(gè)中介服務(wù)器,該服務(wù)器作為控件和后臺(tái)系統(tǒng)信息交流的中介;另一種是不設(shè)中介服務(wù)器,但在提供實(shí)時(shí)數(shù)據(jù)的后臺(tái)服務(wù)器上 留出供控件通信用的數(shù)據(jù)接口,控件可以直接從后臺(tái)服務(wù)器上定時(shí)獲得當(dāng)前實(shí)時(shí)數(shù)據(jù)。按數(shù)據(jù)提供方式分也有兩種:一種是由客戶端定時(shí)向服務(wù)器發(fā)出請求,指明需 要的實(shí)時(shí)數(shù)據(jù),服務(wù)器收到請求后將滿足請求的動(dòng)態(tài)數(shù)據(jù)發(fā)送至相應(yīng)客戶;另一種是客戶端只請求一次,服務(wù)器端便定時(shí)將滿足請求的實(shí)時(shí)數(shù)據(jù)傳到客戶端,直到客 戶更換要顯示的圖表或停止刷新。上述各方案都有其優(yōu)點(diǎn)和局限,在應(yīng)用中可考慮實(shí)際情況采用相應(yīng)方案。
工作流程為:用戶先從Web服務(wù)器上下載包含ActiveX 控件的網(wǎng)頁,控件隨即在客戶機(jī)上注冊運(yùn)行,并通過Winsock同中介服務(wù)器或直接同提供實(shí)時(shí)信息的網(wǎng),如股票信息網(wǎng)相連接,定時(shí)取得動(dòng)態(tài)實(shí)時(shí)數(shù)據(jù),并刷 新顯示。在這個(gè)體系中,客戶有兩條線路獲得信息,一條是和Web Server的連接,從這條線上用戶訪問主頁;另一條就是控件和后臺(tái)信息網(wǎng)的連接,從這條線路上用戶可以訪問實(shí)時(shí)數(shù)據(jù)。后一條線路用Winsock建立, 傳輸速度遠(yuǎn)大于前一條線路,且控制靈活、效率高,不和主頁下載爭資源。通過這條線路,用戶甚至可以傳送遠(yuǎn)程控制信息實(shí)現(xiàn)遙控操作。
利用MFC開發(fā)ActiveX控件
利用VC5.0 開發(fā)的這種控件,功能可擴(kuò)展性強(qiáng),理論上獨(dú)立的VC5.0程序具有的功能,該控件都能實(shí)現(xiàn),例如控件直接繪制瀏覽器,可以使用OpenGL等圖庫,圖形圖 像功能強(qiáng)大。實(shí)時(shí)數(shù)據(jù)刷新頻率理論上可達(dá)毫秒級(jí),用戶通過鼠標(biāo)可以實(shí)現(xiàn)各類交互操作,如旋轉(zhuǎn)、縮放,圖2就是一幅GL圖形,并有一個(gè)縮放工具條進(jìn)行縮放操 作。如果是在計(jì)算機(jī)上觀看,可以看到這幾個(gè)三維圖在不斷旋轉(zhuǎn)。
應(yīng)該說,較好的開發(fā)工具可直接用API編程或使用ATL模板庫,利用MFC開發(fā)ActiveX控件不是一個(gè)好的選擇,因?yàn)榭丶\(yùn)行需要MFC DLL的支持。假如客戶機(jī)器上沒有這些類庫(這種情況很少,但確實(shí)存在),第一次下載就要花費(fèi)些工夫。不過對于熟悉MFC的開發(fā)員來說,這些問題相對MFC提供的便利來說都是可以忽略的。
由于VC5.0對ActiveX控件的開發(fā)提供了許多便利,所以開發(fā)一個(gè)ActiveX控 件并不像許多人想象中的那么困難復(fù)雜,通過VC 5.0的AppWizard,實(shí)現(xiàn)控件的主類從ColeControl類派生出來,該類則是CWnd的一個(gè)子類,所以你可以像對窗口類編程一樣對這個(gè)主類 編程。為了實(shí)現(xiàn)上面提及的功能,首先必要重載它的OnDraw函數(shù)加入需要繪制的對象,加入Winsock類(CSocket或 CAsyncSocket),以實(shí)現(xiàn)與后端數(shù)據(jù)服務(wù)器的通信。如果需要用OpenGL繪制豐富多彩的立體圖,則要初始化GL環(huán)境。其他的工作就在于用戶如 何控制程序的調(diào)度,使得各功能都能正常工作且與其他部分正常通信。此外,后端服務(wù)器程序也要增加對應(yīng)于該控件的接口。
這樣的一個(gè)程序編譯通過后,就成為一個(gè)可用于Web的控件,后綴名是OCX。按照前面敘述的方法將該OCX置入主頁,基本的工作就算完成。
綜上所述,利用VC5.0開發(fā)ActiveX控件用于Web瀏覽,主要有以下幾個(gè)特點(diǎn):
1.采用Winsock的通信機(jī)制,速度快、控制靈活、效率高;
2.控件采用VC5.0編制,功能可擴(kuò)展性很強(qiáng);
4.控件第一次下載雖然稍費(fèi)時(shí)間,但下載后即在用戶機(jī)上注冊,以后可直接調(diào)用,速度效率均好;
5.ActiveX技術(shù)是微軟發(fā)展的重中之重,且已成為當(dāng)前軟件發(fā)展的潮流所向,發(fā)展空間廣闊;
6.系統(tǒng)采用VC開發(fā),可以利用已有的采用C語言編制的系統(tǒng),開發(fā)工作量大大減少。
Web頁面的開發(fā)主要分為三類:靜態(tài)Web頁面、半動(dòng)態(tài)Web頁面以及Client端動(dòng)態(tài)頁面。本文重點(diǎn)論述基于ActiveX Control(控件)動(dòng)態(tài)實(shí)時(shí)頁面的開發(fā)。
regsvr32 netshare.ocx????????注冊netshare.ocx控件
regsvr32 /u netshare.ocx??? 解除netshare.ocx控件的注冊
?
總結(jié)
以上是生活随笔為你收集整理的一篇介绍VC开发OCX的文章,写得太棒了!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同时绑定onpropertychange
- 下一篇: Map value类型不同的写法