现在的位置: 首页 > 综合 > 正文

C++基于ATL工程编写安全的ActiveX控件

2012年12月19日 ⁄ 综合 ⁄ 共 1252字 ⁄ 字号 评论关闭

继前一篇关于ActiveX控件的博客之后,现在再增加一部分后续的问题

如何编写一个安全的ActiveX控件

ActiveX控件,用js调用时经常因为IE浏览器安全权限问题被阻止或提示等,

先来看下IE权限设置,如下图,IE选项的安全标签,选择自定义级别,可以找到如下所示

有一部分专门对ActiveX控件的设置,



如果我们默认设置且编写一个未标记安全的控件,则会出现如下被禁用提示



点击允许阻止的内容当然也可以正常运行,难免觉得不是很友好.

下面加上一小段代码即可标记为安全

在我们的ActiveX Control类中的继承列表加上对IObjectSafetyImpl的实现

	public IObjectSafetyImpl<Ctest, 
                        INTERFACESAFE_FOR_UNTRUSTED_CALLER | 
                        INTERFACESAFE_FOR_UNTRUSTED_DATA>

模板第一个参数为控件类名,如我的类就叫Ctest

第二个参数中对于信任级别的设置(不是很确定,大致如此)

此后再在COM_MAP中添加一行

COM_INTERFACE_ENTRY(IObjectSafety)


整个完成下来即可

代码类似于

class ATL_NO_VTABLE Ctest :
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<Ctest, &CLSID_test>,
	public ISupportErrorInfo,
	public IConnectionPointContainerImpl<Ctest>,
	public CProxy_ItestEvents<Ctest>,
	public IObjectWithSiteImpl<Ctest>,
	public IDispatchImpl<Itest, &IID_Itest, &LIBID_CryptoAPILib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
	public IObjectSafetyImpl<Ctest,                                //这一行需要添加的
                        INTERFACESAFE_FOR_UNTRUSTED_CALLER | 
                        INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
public:
	Ctest()
	{
	}

DECLARE_REGISTRY_RESOURCEID(IDR_TEST)


BEGIN_COM_MAP(Ctest)
	COM_INTERFACE_ENTRY(Itest)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(ISupportErrorInfo)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
	COM_INTERFACE_ENTRY(IObjectWithSite)
	COM_INTERFACE_ENTRY(IObjectSafety)             //这一行需要添加的
END_COM_MAP()

参考文章:

1.code project

2.MSDN

抱歉!评论已关闭.