使用 IObjectSafety 标记 ATL 控件初始化的安全

MSDN原文。这里我将代码使用到了BHO里面,运行调试没问题。拿来分享一下

概要

您可以使用 IObjectSafetyImpl 的默认实现来标记为可安全执行脚本的控件。在许多情况下,您需要将标记为可安全执行初始化的控件。

注意: 如果它真正是安全只是标注为可安全执行脚本或初始化控件。如果该控件是潜在的不安全和被标记为可安全执行,您可能应承担相应责任的损害。请参阅下面的参考资源部分,有关的详细信息。

回到顶端 | 提供反馈

更多信息

如何才能获取所需的功能所需的步骤涉及到使用 IObjectSafetyImpl 作为一个从派生的控件的类和重写 GetInterfaceSafetyOptions 和 SetInterfaceSafetyOptions。这允许您实现所需的功能,在这种情况下意味着标记为可安全执行脚本和初始化控件。

若要使用 IObjectSafetyImpl,您需要将其添加到您的控件派生自的类的列表。例如,多边形教程中,您看到如下:

class ATL_NO_VTABLE CPolyCtl :
...
   public IObjectSafetyImpl<CPolyCtl> // ATL‘s version of
                                     // IObjectSafety
{
public:
   BEGIN_COM_MAP(CPolyCtl)
...
      COM_INTERFACE_ENTRY_IMPL(IObjectSafety) // Tie IObjectSafety
                                              // to this COM map
   END_COM_MAP()

STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid,
                                  DWORD *pdwSupportedOptions,
                                  DWORD *pdwEnabledOptions)
{
ATLTRACE(_T("CObjectSafetyImpl::GetInterfaceSafetyOptions\n"));
if (!pdwSupportedOptions || !pdwEnabledOptions)
   return E_FAIL;
LPUNKNOWN pUnk;
if (_InternalQueryInterface (riid, (void**)&pUnk) == E_NOINTERFACE) {
   // Our object doesn‘t even support this interface.
   return E_NOINTERFACE;
}else{
   // Cleanup after ourselves.
   pUnk->Release();
   pUnk = NULL;
}
if (riid == IID_IDispatch) {
   // IDispatch is an interface used for scripting. If your
   // control supports other IDispatch or Dual interfaces, you
   // may decide to add them here as well. Client wants to know
   // if object is safe for scripting. Only indicate safe for
   // scripting when the interface is safe.
   *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
   *pdwEnabledOptions = m_dwSafety &
                        INTERFACESAFE_FOR_UNTRUSTED_CALLER;
   return S_OK;
}else if ((riid == IID_IPersistStreamInit) ||
          (riid == IID_IPersistStorage)) {
   // IID_IPersistStreamInit and IID_IPersistStorage are
   // interfaces used for Initialization. If your control
   // supports other Persistence interfaces, you may decide to
   // add them here as well. Client wants to know if object is
   // safe for initializing. Only indicate safe for initializing
   // when the interface is safe.
   *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
   *pdwEnabledOptions = m_dwSafety &
                        INTERFACESAFE_FOR_UNTRUSTED_DATA;
   return S_OK;
}else{
   // We are saying that no other interfaces in this control are
   // safe for initializing or scripting.
   *pdwSupportedOptions = 0;
   *pdwEnabledOptions = 0;
   return E_FAIL;
}
}

STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid,
                                  DWORD dwOptionSetMask,
                                  DWORD dwEnabledOptions)
{
ATLTRACE(_T("CObjectSafetyImpl::SetInterfaceSafetyOptions\n"));
if (!dwOptionSetMask && !dwEnabledOptions) return E_FAIL;
LPUNKNOWN pUnk;
if (_InternalQueryInterface (riid, (void**)&pUnk) == E_NOINTERFACE) {
   // Our object doesn‘t even support this interface.
   return E_NOINTERFACE;
}else{
   // Cleanup after ourselves.
   pUnk->Release();
   pUnk = NULL;
}
// Store our current safety level to return in
// GetInterfaceSafetyOptions
m_dwSafety |= dwEnabledOptions & dwOptionSetMask;
if ((riid == IID_IDispatch) &&
    (m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_CALLER)) {
   // Client wants us to disable any functionality that would
   // make the control unsafe for scripting. The same applies to
   // any other IDispatch or Dual interfaces your control may
   // support. Because our control is safe for scripting by
   // default we just return S_OK.
   return S_OK;
}else if (((riid == IID_IPersistStreamInit) ||
           (riid == IID_IPersistStorage)) &&
          (m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_DATA)) {
   // Client wants us to make the control safe for initializing
   // from persistent data. For these interfaces, this control
   // is safe so we return S_OK. For Any interfaces that are not
   // safe, we would return E_FAIL.
   return S_OK;
}else{
   // This control doesn‘t allow Initialization or Scripting
   // from any other interfaces so return E_FAIL.
   return E_FAIL;
}
}
...
}
				

在 ATL 3.0 中,IObjectSafetyImpl 的实现已更改,以便可以作为模板参数现在提供的安全选项。例如,上面的类声明将显示为

class ATL_NO_VTABLE CPolyCtl :
...
   public IObjectSafetyImpl<CPolyCtl,
      INTERFACESAFE_FOR_UNTRUSTED_CALLER |
         INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
public:
   BEGIN_COM_MAP(CPolyCtl)
...
				

和您不需要重写两个方法。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

192093PRB: 编译器错误时将移植到 ATL 3.0 IObjectSafetyImpl

参考

有关标记为可安全执行脚本和初始化的 ActiveX 控件的其他信息,请参阅下列文章 Microsoft 知识库中相应的文章:

161873如何将标记为脚本初始化 MFC 控件安全

164119示例: 在 ActiveX 控件中实现 IObjectSafety

时间: 2024-11-05 18:45:54

使用 IObjectSafety 标记 ATL 控件初始化的安全的相关文章

silverlight 控件初始化和布局

https://msdn.microsoft.com/zh-cn/library/dd351483(v=vs.95).aspx 控件初始化和布局 Silverlight 当您创建控件时,务必了解初始化和布局事件和方法的顺序. 这样,您就知道用于改写的正确方法或要处理的正确事件以获得特定的效果. 通常,可以构造 Silverlight 控件并设置其属性:接着创建其可视化表示形式或可视化树:然后该控件经历整个布局过程. 下表列出了在控件创建和布局期间所设置的属性以及发生的事件和方法. 属性.方法和事

UI控件初始化问题:initWithFrame和initWithCoder、aweakFromNib的执行

在iOS学习和程序开发过程中,我们经常会遇到一些自定义UI控件或控制器在初始化时出现问题,尤其在大家刚开始接触时,几种初始化方法的作用以及调用的时机往往容易混淆,这也跟我们对iOS程序设计中,类的创建和实例化的过程了解不透彻有关系.本文用一些小例子来简单梳理一下几者的关系,后面再陆续讨论一些复杂情况的深入对比. 问题: 一.什么时候用initWithFrame,什么时候用aweakFromNib.initWithCoder 二.在初始化时控件自身的frame何时能获得?layoutSubView

MFC学习之EDIT控件初始化

//四种方法为EDIT控件初始化     //调用系统API     HWND hEidt = ::GetDlgItem(m_hWnd,IDC_EDIT1);     ::SetWindowText(hEidt,L"0.");     //调用类成员函数     GetDlgItem(IDC_EDIT1)->SetWindowText(L"0.");     //设置控件的数值类变量     m_edit_cs = L"0.";     U

atl控件发布打包&lt;转&gt;

http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html ActiveX打包与发布 在VS2005或VS2008安装后发现路径**VC7\Common7\Tools\Bin\下有许多小工具,我对带有Cert的文件比较感兴趣.经过研究,发现是有关证书和签名的,当然,该证书未被证书认证机构认可.下面列出这些工具和我的使用心得.1.Makecert.exe ---证书创建工具2.Cert2Spc.exe ---发行者证书测试工具3

百度MapApi1.4------addControl各种控件初始化

//地图平移缩放控件,PC 端默认位于地图左上方,它包含控制地图的平移和缩放的 map.addControl(new BMap.NavigationControl()); //比例尺控件,默认位于地图左下方,显示地图的比例关系 map.addControl(new BMap.ScaleControl()); //缩略地图控件,默认位于地图右下方,是一个可折叠的缩略地图 map.addControl(new BMap.OverviewMapControl()); //添加地图类型控件,默认位于地图

[QT]问题记录-控件初始化导致程序异常关闭

qt新手,在设置 pushButton 的字体颜色时,出现软件异常闭,代码如下: 按钮的初始化在  ui->setupUi(this); 前边,会出现一下问题. 解决办法:将按钮的初始化在  ui->setupUi(this); 后边即可解决这个问题. 这是个基础的知识.类似的问题有: http://www.qtcn.org/bbs/read.php?tid-48535.html 如果有小伙伴知道有类似的问题,麻烦请回复下,谢谢.

Combox控件初始化项的技巧

有时候combox下拉项就是几条固定的,不需要做数据绑定,但是如果直接采用字符串集合编辑器的时候,SelectedValue貌似会不起作用. 于是简单的封装一下 /// <summary> /// 绑定combox 按顺序填写value.member 示例:InitCombox.BindCombox(cbxStatus,"1","启用","0","禁用"); /// </summary> /// <

如何将 MFC ActiveX 控件标记为安全,脚本和初始化

MSDN原文.ActiveX控件标记安全(可以不仅仅是MFC ActiveX) 概要 默认情况下,MFC ActiveX 控件未标记为对脚本编写是安全的和对初始化是安全的.控制运行在 Internet Explorer 中使用的安全级别设置为中或高时,这一点很明显.在上述这些模式中,控件的数据是不安全或不可能安全脚本中使用该控件,可能会显示警告. 有两个控件可用于消除这些错误的方法.第一个涉及实现 IObjectSafety 接口的控件,并对于想要更改其行为变得"安全"的互联网浏览器的

使用VC2008中ATL开发浏览器控件

http://blog.csdn.net/cnjet/article/details/6218355 使用VC2008中ATL开发浏览器控件 2011.03.02 [email protected] 介绍 本文将介绍使用VC2008中的ATL开发一个用于网络部署的cab控件包的过程. 建立ATL项目 打开VS2008,建立一个ATL项目,如下图: 考虑到简介性,选择了"Allow merging of proxy/stub code" 添加ATL控件 (建议先编译一下真个project