继前一篇关于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()
参考文章:
2.MSDN