使你的ActiveX控件执行时不弹出安全性提示.docx
- 文档编号:2978750
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:6
- 大小:16.97KB
使你的ActiveX控件执行时不弹出安全性提示.docx
《使你的ActiveX控件执行时不弹出安全性提示.docx》由会员分享,可在线阅读,更多相关《使你的ActiveX控件执行时不弹出安全性提示.docx(6页珍藏版)》请在冰豆网上搜索。
使你的ActiveX控件执行时不弹出安全性提示
使你的ActiveX控件执行时不弹出安全性提示
方法1:
修改注册表
可能你在看完下面的过程后会发觉,程序没有一个地点对注册表操作过。
事实上不然,那个地点所谓的修改注册表的方法确实是使用组件类型治理器(ComponentCategoriesManager)创建一个正确的入口到系统注册表。
IE通过检测注册表判定一个控件是否能够安全地初始化和脚本操作。
IE会通过调用ICatInformation:
:
IsClassOfCategories方法确定控件是否支持给出的安全性分组。
其中对注册表的操作都差不多封装起来,隐藏在底层了,因此看不到。
必须包括两个头文件
#include
#include
constGUIDCDECLCLSID_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(len>127)
{
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))
{
//Unregisterthiscategoryasbeing"implemented"bytheclass.
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_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
//#include
#include
//TestAXCtl.h:
DeclarationoftheCTestAXCtrlActiveXControlclass.
/////////////////////////////////////////////////////////////////////////////
//CTestAXCtrl:
SeeTestAXCtl.cppforimplementation.
classCTestAXCtrl:
publicCOleControl
{
DECLARE_DYNCREATE(CTestAXCtrl)
//Constructor
public:
CTestAXCtrl();
//增加如下代码:
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(MyObjSafe,IObjectSafety)
STDMETHOD_(HRESULT,GetInterfaceSafetyOptions)(
REFIIDriid,
DWORD__RPC_FAR*pdwSupportedOptions,
DWORD__RPC_FAR*pdwEnabledOptions
);
STDMETHOD_(HRESULT,SetInt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ActiveX 控件 执行 弹出 安全性 提示