使你的ActiveX控件執(zhí)行時不彈出安全性提示_第1頁
使你的ActiveX控件執(zhí)行時不彈出安全性提示_第2頁
使你的ActiveX控件執(zhí)行時不彈出安全性提示_第3頁
使你的ActiveX控件執(zhí)行時不彈出安全性提示_第4頁
使你的ActiveX控件執(zhí)行時不彈出安全性提示_第5頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、我們編寫一個 ActiveX 控件在 IE 中運行,一般會彈出一個安全提示,如何避免這種情況?下面是我在參考前人的文章后,總結(jié)出“在瀏覽器中執(zhí)行時不彈出警告的 ActiveX 控件”的兩種編寫方法,予以備忘。注意,這里不會彈出警告是說在執(zhí)行時不會彈出,也就是說已經(jīng)安裝了這個 ActiveX 控件。如果要下載安裝這個 ActiveX 控件時不會彈出安全警告,恐怕就得去買數(shù)字證書了。不過即使有數(shù)字證書,還是得用戶同意后才會下載安裝。以下兩種方法在 WINXP-SP2+VC6 通過。方法 1:修改注冊表可能你在看完下面的過程后會發(fā)現(xiàn),程序沒有一個地方對注冊表操作過。其實不然,這里所謂的修改注冊表的方

2、法就是使用組件類型管理器(ComponentCategoriesManager)創(chuàng)建一個正確的入口到系統(tǒng)注冊表。IE 通過檢測注冊表判斷一個控件是否可以安全地初始化和腳本操作。IE 會通過調(diào)用 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)文件中進(jì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);/調(diào)用方法與數(shù)據(jù)是否可信任,設(shè)置這兩個標(biāo)志位就可以了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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論