




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、我們編寫一個 ActiveX 控件在 IE 中運行,一般會彈出一個安全提示,如何避免這種情況?下面是我在參考前人的文章后,總結出“在瀏覽器中執(zhí)行時不彈出警告的 ActiveX 控件”的兩種編寫方法,予以備忘。注意,這里不會彈出警告是說在執(zhí)行時不會彈出,也就是說已經(jīng)安裝了這個 ActiveX 控件。如果要下載安裝這個 ActiveX 控件時不會彈出安全警告,恐怕就得去買數(shù)字證書了。不過即使有數(shù)字證書,還是得用戶同意后才會下載安裝。以下兩種方法在 WINXP-SP2+VC6 通過。方法 1:修改注冊表可能你在看完下面的過程后會發(fā)現(xiàn),程序沒有一個地方對注冊表操作過。其實不然,這里所謂的修改注冊表的方
2、法就是使用組件類型管理器(ComponentCategoriesManager)創(chuàng)建一個正確的入口到系統(tǒng)注冊表。IE 通過檢測注冊表判斷一個控件是否可以安全地初始化和腳本操作。IE 會通過調用 ICatInformation:IsClassOfCategories 方法確定控件是否支持給出的安全性分組。其中對注冊表的操作都已經(jīng)封裝起來,隱藏在底層了,所以看不到。必須包括兩個頭文件#include#includeconstGUIDCDECLCLSID_SafeItem=0 xD321B11E,0 x8E79,0 x4829,0 xAB,0 x80,0 x9E,0 x59,0 x92,0 x06,
3、0 xAB,0 xB7;/用你的控件類 GUID 替換/注冊組件種類為安全HRESULTAddCategorySafty(CATIDcatid,TCHAR*catDescription)ICatRegister*pcr=NULL;HRESULThr=S_OK;hr=CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void*)&pcr);if(FAILED(hr)returnhr;CATEGORYINFOcatinfo;catinfo.catid=ca
4、tid;catinfo.lcid=0 x0409;/英語語言/最長只拷貝 127 個字符。intlen=lstrlen(catDescription);if(len127)len=127;)lstrcpyn(TCHAR*)(catinfo.szDescription),catDescription,len+1);hr=pcr-RegisterCategories(1,&catinfo);pcr-Release();returnhr;)/移除已經(jīng)注冊為安全的組件種類HRESULTRemoveCategorySafty(CATIDcatid)ICatRegister*pcr=NULL;HR
5、ESULThr=S_OK;hr=CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void*)&pcr);if(FAILED(hr)returnhr;hr=pcr-UnRegisterCategories(1,&catid);pcr-Release();returnhr;)/把你的控件注冊到已經(jīng)注冊為安全的組件種類HRESULTRegisterCLSIDInCategory(REFCLSIDclsid,CATIDcatid)ICatRegist
6、er*pcr=NULL;HRESULThr=S_OK;hr=CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void*)&pcr);if(SUCCEEDED(hr)CATIDrgcatid1;rgcatid0=catid;hr=pcr-RegisterClassImplCategories(clsid,1,rgcatid);)if(pcr!=NULL)pcr-Release();returnhr;/把你的控件從安全組件種類移除HRESULTUnReg
7、isterCLSIDInCategory(REFCLSIDclsid,CATIDcatid)(ICatRegister*pcr=NULL;HRESULThr=S_OK;hr=CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void*)&pcr);if(SUCCEEDED(hr)(/Unregisterthiscategoryasbeingimplementedbytheclass.CATIDrgcatid1;rgcatid0=catid;hr=pcr
8、-UnRegisterClassImplCategories(clsid,1,rgcatid);if(pcr!=NULL)pcr-Release();returnhr;/使你的控件不彈出警告地執(zhí)行HRESULTMakeActiveXSafty(REFCLSIDclsid)(HRESULThr;hr=AddCategorySafty(CATID_SafeForInitializing,_T(Controlssafelyinitializable!);if(FAILED(hr)returnhr;hr=RegisterCLSIDInCategory(clsid,CATID_SafeForInitia
9、lizing);if(FAILED(hr)returnhr;hr=AddCategorySafty(CATID_SafeForScripting,_T(Controlssafelyscriptable!);if(FAILED(hr)returnhr;hr=RegisterCLSIDInCategory(clsid,CATID_SafeForScripting);returnhr;/去除控件的安全執(zhí)行性HRESULTUnMakeActiveXSafty(REFCLSIDclsid)(HRESULThr;hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeFo
10、rInitializing);if(FAILED(hr)returnhr;hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeForScripting);if(FAILED(hr)returnhr;/下面的代碼是把安全組件種類去掉。去掉的話,如果有其他的控件注冊為這兩個種類/那么其他的控件執(zhí)行時就會彈出警告。需不需要下面的代碼就見仁見智,看實際情況了hr=RemoveCategorySafty(CATID_SafeForInitializing);if(FAILED(hr)returnhr;hr=RemoveCategorySafty(CATID_Safe
11、ForScripting);returnhr;然后在 DllRegisterServer 函數(shù)的“returnNOERROR:前添加如下代碼:HRESULThr=MakeActiveXSafty(CLSID_SafeItem);if(FAILED(hr)returnhr;在 DllUnregisterServer 函數(shù)的AFX_MANAGE_STATE(_afxModuleAddrThis);后添加如下代碼:HRESULThr=UnMakeActiveXSafty(CLSID_SafeItem);if(FAILED(hr)OutputDebugString(_T(去除控件的安全執(zhí)行性時出錯!)
12、;方法 2:實現(xiàn) ObjectSafe 接口我創(chuàng)建了一個 MFCActiveXControlWizard 的工程,工程為 TestAX,它的控件類是 CTestAXCtrl,下面所有的代碼和操作都是在這個類的頭文件和實現(xiàn)文件中進行。紅色的部分是為了實現(xiàn)ObjectSafe 接口而增加的代碼。在頭文件中:#if!defined(AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_)#defineAFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_#if_
13、MSC_VER1000#pragmaonce#endif/_MSC_VER1000/#include#include/增加這個頭文件/TestAXCtl.h:DeclarationoftheCTestAXCtrlActiveXControlclass./CTestAXCtrl:SeeTestAXCtl.cppforimplementation.classCTestAXCtrl:publicCOleControlDECLARE_DYNCREATE(CTestAXCtrl)/Constructorpublic:CTestAXCtrl();/增加如下代碼:DECLARE_INTERFACE_MAP(
14、)BEGIN_INTERFACE_PART(MyObjSafe,IObjectSafety)STDMETHOD_(HRESULT,GetInterfaceSafetyOptions)(REFIIDriid,DWORD_RPC_FAR*pdwSupportedOptions,DWORD_RPC_FAR*pdwEnabledOptions);STDMETHOD_(HRESULT,SetInterfaceSafetyOptions)(REFIIDriid,DWORDdwOptionSetMask,DWORDdwEnabledOptions);END_INTERFACE_PART(MyObjSafe)
15、;0000c)o在實現(xiàn)文件中:/TestAXCtl.cpp:ImplementationoftheCTestAXCtrlActiveXControlclass.#includestdafx.h#includetestAX.h#includeTestAXCtl.h#includeTestAXPpg.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE 口=_FILE#endifIMPLEMENT_DYNCREATE(CTestAXCtrl,COleControl)/接口映射BEGIN_INTERFACE_MAP(CT
16、estAXCtrl,COleControl)INTERFACE_PART(CTestAXCtrl,IID_IObjectSafety,MyObjSafe)END_INTERFACE_MAP()oooooo(其他代碼省略)/接口的函數(shù)實現(xiàn)ULONGFAREXPORTCTestAXCtrl:XMyObjSafe:AddRef()METHOD_PROLOGUE(CTestAXCtrl,MyObjSafe)returnpThis-ExternalAddRef();ULONGFAREXPORTCTestAXCtrl:XMyObjSafe 二 Release。METHOD_PROLOGUE(CTestAX
17、Ctrl,MyObjSafe)returnpThis-ExternalRelease();HRESULTFAREXPORTCTestAXCtrl:XMyObjSafe:QueryInterface(REFIIDiid,voidFAR*FAR*ppvObj)METHOD_PROLOGUE(CTestAXCtrl,MyObjSafe)return(HRESULT)pThis-ExternalQueryInterface(&iid,ppvObj);/調用方法與數(shù)據(jù)是否可信任,設置這兩個標志位就可以了constDWORDg_dwSupportedBits=INTERFACESAFE_FOR_U
18、NTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;constDWORDg_dwNotSupportedBits=g_dwSupportedBits;HRESULTFAREXPORTCTestAXCtrl:XMyObjSafe 二GetInterfaceSafetyOptions(REFIIDriid,DWORD_RPC_FAR*pdwSupportedOptions,DWORD_RPC_FAR*pdwEnabledOptions)METHOD_PROLOGUE(CTestAXCtrl,MyObjSafe)*pdwSupportedOptions=*pdwEnabledOptions=g_dwSupportedBits;returnS_OK;.HRESULTFAREXPORTCTestAXCtrl:XMyObjSafe:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供電公司外委管理辦法
- 虛擬展覽技術-洞察及研究
- 智慧教室材料管理辦法
- 養(yǎng)蜂管理辦法(試行)
- 村級資金使用管理辦法
- 公司內部招待管理辦法
- 農(nóng)村便利設施管理辦法
- 使用軟件考勤管理辦法
- 數(shù)字技術在工作變革和家庭平衡中的應用與影響研究
- 環(huán)境適應性培訓-洞察及研究
- 毀林毀草違規(guī)行為集中整治實施方案
- 日本2025年食品過敏原培訓
- 中新天津生態(tài)城教育系統(tǒng)招聘教職人員筆試真題2024
- GB/T 45817-2025消費品質量分級陶瓷磚
- DB37∕T 5302-2024 既有城市橋梁現(xiàn)場檢測及承載能力評估技術標準
- 安徽省池州市貴池區(qū)2024-2025學年八年級下學期數(shù)學期末檢測試卷(含答案)
- JJG 693-2011可燃氣體檢測報警器
- 智慧的光芒普照每位學生 論文
- 銷售行業(yè)跑業(yè)務計劃書
- 政府采購詢價采購函報價單格式及論大學生寫作能力
- 建筑物拆除工程監(jiān)理實施細則
評論
0/150
提交評論