js调用activex添加的安全代码文档格式.docx
- 文档编号:16506018
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:11
- 大小:17.80KB
js调用activex添加的安全代码文档格式.docx
《js调用activex添加的安全代码文档格式.docx》由会员分享,可在线阅读,更多相关《js调用activex添加的安全代码文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
if(len&
127)
len=127;
wcsncpy(catinfo.szDescription,catDescription,len);
catinfo.szDescription[len]='
\0'
;
hr=pcr-&
RegisterCategories(1,&
catinfo);
pcr-&
Release();
returnhr;
}
HRESULTRegisterCLSIDInCategory(REFCLSIDclsid,CATIDcatid)
ICatRegister*pcr=NULL;
NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister,(void**)&
if(SUCCEEDED(hr))
CATIDrgcatid[1];
rgcatid[0]=catid;
RegisterClassImplCategories(clsid,1,rgcatid);
if(pcr!
=NULL)
pcr-&
}HRESULTUnRegisterCLSIDInCategory(REFCLSIDclsid,CATIDcatid)
UnRegisterClassImplCategories(clsid,1,rgcatid);
}BOOLCDown_Clear_OCXCtrl:
:
CDown_Clear_OCXCtrlFactory:
UpdateRegistry(BOOLbRegister)
if(bRegister)
hr=CreateComponentCategory(CATID_SafeForScripting,
L"
Controlsthataresafelyscriptable"
);
if(FAILED(hr))
returnFALSE;
hr=RegisterCLSIDInCategory(m_clsid,CATID_SafeForScripting);
hr=RegisterCLSIDInCategory(m_clsid,CATID_SafeForInitializing);
returnAfxOleRegisterControlClass(AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_DOWN_CLEAR_OCX,
IDB_DOWN_CLEAR_COX,
afxRegInsertable|afxRegApartmentThreading,
_dwDown_Clear_OCXOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
hr=UnRegisterCLSIDInCategory(m_clsid,CATID_SafeForScripting);
hr=UnRegisterCLSIDInCategory(m_clsid,CATID_SafeForInitializing);
returnAfxOleUnregisterClass(m_clsid,m_lpszProgID);
}使你的ActiveX控件执行时不弹出安全性提示
2010-06-1919:
57
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?
下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘。
注意,这里不会弹出警告是说在执行时不会弹出,也就是说已经安装了这个ActiveX控件。
如果要下载安装这个ActiveX控件时不会弹出安全警告,恐怕就得去买数字证书了。
不过即使有数字证书,还是得用户同意后才会下载安装。
以下两种方法在WINXP-SP2+VC6下通过。
方法1:
修改注册表
可
能你在看完下面的过程后会发现,程序没有一个地方对注册表操作过。
其实不然,这里所谓的修改注册表的方法就是使用组件类型管理器(Component
Categories
Manager)创建一个正确的入口到系统注册表。
IE通过检测注册表判断一个控件是否可以安全地初始化和脚本操作。
IE会通过调用
ICatInformation:
IsClassOfCategories
方法确定控件是否支持给出的安全性分组。
其中对注册表的操作都已经封装起来,隐藏在底层了,所以看不到。
必须包括两个头文件
comcat.h&
Objsafe.h&
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**)&
if(FAILED(hr))
catinfo.lcid=0x0409;
//英语语言//最长只拷贝127个字符。
intlen=lstrlen(catDescription);
if(len&
127)
lstrcpyn((TCHAR*)(catinfo.szDescription),catDescription,len+1);
hr=pcr-&
RegisterCategories(1,&
//移除已经注册为安全的组件种类
HRESULTRemoveCategorySafty(CATIDcatid)
UnRegisterCategories(1,&
catid);
//把你的控件注册到已经注册为安全的组件种类
HRESULTRegisterCLSIDInCategory(REFCLSIDclsid,CATIDcatid)
if(SUCCEEDED(hr))
{
CATIDrgcatid[1];
rgcatid[0]=catid;
RegisterClassImplCategories(clsid,1,rgcatid);
}
if(pcr!
//把你的控件从安全组件种类移除
HRESULTUnRegisterCLSIDInCategory(REFCLSIDclsid,CATIDcatid)
//Unregisterthiscategoryasbeing"
implemented"
bytheclass.
UnRegisterClassImplCategories(clsid,1,rgcatid);
}if(pcr!
//使你的控件不弹出警告地执行
HRESULTMakeActiveXSafty(REFCLSIDclsid)
HRESULThr;
hr=AddCategorySafty(CATID_SafeForInitializing,
_T("
Controlssafelyinitializable!
"
));
hr=RegisterCLSIDInCategory(clsid,CATID_SafeForInitializing);
hr=AddCategorySafty(CATID_SafeForScripting,_T("
Controlssafelyscriptable!
hr=RegisterCLSIDInCategory(clsid,CATID_SafeForScripting);
//去除控件的安全执行性
HRESULTUnMakeActiveXSafty(REFCLSIDclsid)
hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeForInitializing);
hr=UnRegisterCLSIDInCategory(clsid,CATID_SafeForScripting);
//下面的代码是把安全组件种类去掉。
去掉的话,如果有其他的控件注册为这两个种类
//那么其他的控件执行时就会弹出警告。
需不需要下面的代码就见仁见智,看实际情况了
hr=RemoveCategorySafty(CATID_SafeForInitializing);
hr=RemoveCategorySafty(CATID_SafeForScripting);
然后在DllRegisterServer函数的“returnNOERROR;
”前添加如下代码:
HRESULThr=MakeActiveXSafty(CLSID_SafeItem);
if(FAILED(hr))
在DllUnregisterServer函数的“AFX_MANAGE_STATE(_afxModuleAddrThis);
”后添加如下代码:
HRESULThr=UnMakeActiveXSafty(CLSID_SafeItem);
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&
//#include&
ComCat.h&
ObjSafe.h&
//增加这个头文件
//TestAXCtl.h:
DeclarationoftheCTestAXCtrlActiveXControlclass.
/////////////////////////////////////////////////////////////////////////////
//CTestAXCtrl:
SeeTestAXCtl.cppforimplementation.
classCTestAXCtrl:
publicCOleControl
DECLARE_DYNCREATE(CTestAXCtrl)
//Constructor
public:
CTestAXCtrl();
//增加如下代码:
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(MyObjSafe,IObjectSafety)//MyObjSafe可以使其他变量名,但是下面用到的地方也需要换
STDMETHOD_(HRESULT,GetInterfaceSafetyOptions)(
REFIIDriid,
DWORD__RPC_FAR*pdwSupportedOptions,
DWORD__RPC_FAR*pdwEnabledOptions
);
STDMETHOD_(HRESULT,SetInterfaceSafetyOptions)(
DWORDdwOptionSetMask,
DWORDdwEnabledOptions
END_INTERFACE_PART(MyObjSafe);
。
在实现文件中:
//TestAXCtl.cpp:
ImplementationoftheCTestAXCtrlActiveXControlclass.
#include"
stdafx.h"
testAX.h"
TestAXCtl.h"
TestAXPpg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
IMPLEMENT_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();
Release()
ExternalRelease();
HRESULTFAREXPORTCTestAXCtrl:
QueryInterface(REFIIDiid,voidFAR*FAR*ppvObj)
return(HRESULT)pThis-&
ExternalQueryInterface(&
iid,ppvObj);
//调用方法与数据是否可信任,设置这两个标志位就可以了
constDWORDg_dwSupportedBits=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;
constDWORDg_dwNotSupportedBits=~g_dwSupportedBits;
GetInterfaceSafetyOptions(REFIIDriid,
DWORD__RPC_FAR*pdwEnabledOptions)
*pdwSupportedOptions=*pdwEnabledOptions=g_dwSupportedBits;
returnS_OK;
SetInterfaceSafetyOptions(REFIIDriid,
DWORDdwEnabledOptions)
//如果有任何一个不支持的设置位,则返回不支持错误。
if(dwOptionSetMask&
g_dwNotSupportedBits)
{
returnCO_E_NOT_SUPPORTED;
//不需要做其他的事情
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- js 调用 activex 添加 安全 代码