您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 使你的ActiveX控件执行时不弹出安全性提示
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘。注意,这里不会弹出警告是说在执行时不会弹出,也就是说已经安装了这个ActiveX控件。如果要下载安装这个ActiveX控件时不会弹出安全警告,恐怕就得去买数字证书了。不过即使有数字证书,还是得用户同意后才会下载安装。以下两种方法在WINXP-SP2+VC6下通过。方法1:修改注册表可能你在看完下面的过程后会发现,程序没有一个地方对注册表操作过。其实不然,这里所谓的修改注册表的方法就是使用组件类型管理器(ComponentCategoriesManager)创建一个正确的入口到系统注册表。IE通过检测注册表判断一个控件是否可以安全地初始化和脚本操作。IE会通过调用ICatInformation::IsClassOfCategories方法确定控件是否支持给出的安全性分组。其中对注册表的操作都已经封装起来,隐藏在底层了,所以看不到。必须包括两个头文件#includecomcat.h#includeObjsafe.hconstGUIDCDECLCLSID_SafeItem={0xD321B11E,0x8E79,0x4829,0xAB,0x80,0x9E,0x59,0x92,0x06,0xAB,0xB7};//用你的控件类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=catid;catinfo.lcid=0x0409;//英语语言//最长只拷贝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;HRESULThr=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){ICatRegister*pcr=NULL;HRESULThr=S_OK;hr=CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void**)&pcr);if(SUCCEEDED(hr)){CATIDrgcatid[1];rgcatid[0]=catid;hr=pcr-RegisterClassImplCategories(clsid,1,rgcatid);}if(pcr!=NULL)pcr-Release();returnhr;}//把你的控件从安全组件种类移除HRESULTUnRegisterCLSIDInCategory(REFCLSIDclsid,CATIDcatid){ICatRegister*pcr=NULL;HRESULThr=S_OK;hr=CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void**)&pcr);if(SUCCEEDED(hr)){//Unregisterthiscategoryasbeingimplementedbytheclass.CATIDrgcatid[1];rgcatid[0]=catid;hr=pcr-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_SafeForInitializing);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_SafeForInitializing);if(FAILED(hr))returnhr;hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeForScripting);if(FAILED(hr))returnhr;//下面的代码是把安全组件种类去掉。去掉的话,如果有其他的控件注册为这两个种类//那么其他的控件执行时就会弹出警告。需不需要下面的代码就见仁见智,看实际情况了hr=RemoveCategorySafty(CATID_SafeForInitializing);if(FAILED(hr))returnhr;hr=RemoveCategorySafty(CATID_SafeForScripting);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(去除控件的安全执行性时出错!));方法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_MSC_VER1000#pragmaonce#endif//_MSC_VER1000//#includeComCat.h#includeObjSafe.h//增加这个头文件//TestAXCtl.h:DeclarationoftheCTestAXCtrlActiveXControlclass.///////////////////////////////////////////////////////////////////////////////CTestAXCtrl:SeeTestAXCtl.cppforimplementation.classCTestAXCtrl:publicCOleControl{DECLARE_DYNCREATE(CTestAXCtrl)//Constructorpublic:CTestAXCtrl();//增加如下代码:DECLARE_INTERFACE_MAP()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);。。。。。。在实现文件中://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(CTestAXCtrl,COleControl)INTERFACE_PART(CTestAXCtrl,IID_IObjectSafety,MyObjSafe)END_INTERFACE_MAP()。。。。。。(其他代码省略)//接口的函数实现ULONGFAREXPORTCTestAXCtrl::XMyObjSafe::AddRef(){METHOD_PROLOGUE(CTestAXCtrl,MyObjSafe)returnpThis-ExternalAddRef();}ULONGFAREXPORTCTestAXCtrl::XMyObjSafe::Release(){METHOD_PROLOGUE(CTestAXCtrl,MyObjSafe)returnpThis-ExternalRelease();}HRESULTF
本文标题:使你的ActiveX控件执行时不弹出安全性提示
链接地址:https://www.777doc.com/doc-1252968 .html