使你的ActiveX控件执行时不弹出安全性提示_第1页
使你的ActiveX控件执行时不弹出安全性提示_第2页
使你的ActiveX控件执行时不弹出安全性提示_第3页
使你的ActiveX控件执行时不弹出安全性提示_第4页
使你的ActiveX控件执行时不弹出安全性提示_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、我们编写一个 ActiveX 控件在 IE 中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的 ActiveX 控件”的两种编写方法,予以备忘。注意,这里不会弹出警告是说在执行时不会弹出,也就是说已经安装了这个 ActiveX 控件。如果要下载安装这个 ActiveX 控件时不会弹出安全警告,恐怕就得去买数字证书了。不过即使有数字证书,还是得用户同意后才会下载安装。以下两种方法在 WINXP-SP2+VC6 通过。方法 1:修改注册表可能你在看完下面的过程后会发现,程序没有一个地方对注册表操作过。其实不然,这里所谓的修改注册表的方

2、法就是使用组件类型管理器(ComponentCategoriesManager)创建一个正确的入口到系统注册表。IE 通过检测注册表判断一个控件是否可以安全地初始化和脚本操作。IE 会通过调用 ICatInformation:IsClassOfCategories 方法确定控件是否支持给出的安全性分组。其中对注册表的操作都已经封装起来,隐藏在底层了,所以看不到。必须包括两个头文件#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;)/移除已经注册为安全的组件种类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;)/把你的控件注册到已经注册为安全的组件种类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;/使你的控件不弹出警告地执行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;/去除控件的安全执行性HRESULTUnMakeActiveXSafty(REFCLSIDclsid)(HRESULThr;hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeFo

10、rInitializing);if(FAILED(hr)returnhr;hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeForScripting);if(FAILED(hr)returnhr;/下面的代码是把安全组件种类去掉。去掉的话,如果有其他的控件注册为这两个种类/那么其他的控件执行时就会弹出警告。需不需要下面的代码就见仁见智,看实际情况了hr=RemoveCategorySafty(CATID_SafeForInitializing);if(FAILED(hr)returnhr;hr=RemoveCategorySafty(CATID_Safe

11、ForScripting);returnhr;然后在 DllRegisterServer 函数的“returnNOERROR:前添加如下代码:HRESULThr=MakeActiveXSafty(CLSID_SafeItem);if(FAILED(hr)returnhr;在 DllUnregisterServer 函数的AFX_MANAGE_STATE(_afxModuleAddrThis);后添加如下代码:HRESULThr=UnMakeActiveXSafty(CLSID_SafeItem);if(FAILED(hr)OutputDebugString(_T(去除控件的安全执行性时出错!)

12、;方法 2:实现 ObjectSafe 接口我创建了一个 MFCActiveXControlWizard 的工程,工程为 TestAX,它的控件类是 CTestAXCtrl,下面所有的代码和操作都是在这个类的头文件和实现文件中进行。红色的部分是为了实现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在实现文件中:/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(其他代码省略)/接口的函数实现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);/调用方法与数据是否可信任,设置这两个标志位就可以了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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论