IObjectSafety (Interfaces)

添加IObjectSafety接口使MFC写的OCX可信 OCX控件在IE下使用弹出安全问题的解决是添加IObjectSafety接口及实现。我的环境是VS2013,找了很久没有找到IObjectSafety需要添加哪些代码,这篇代码很详细。 阅读详情

 

Summary
IObjectSafety is used to mark ActiveX Controls safe for scripting.

C# Definition:

[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

public interface IObjectSafety

{

  [PreserveSig]
  int GetInterfaceSafetyOptions(ref Guid riid,
                [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions,
                [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

  [PreserveSig()]
  int SetInterfaceSafetyOptions(ref Guid riid,
                [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask,
                [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);

}

C# Sample Implementation:

using System;

using System.Runtime.InteropServices;

[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

public interface IObjectSafety

{

  [PreserveSig]
  int GetInterfaceSafetyOptions(ref Guid riid,
                [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions,
                [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

  [PreserveSig()]
  int SetInterfaceSafetyOptions(ref Guid riid,
                [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask,
                [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);

}

public class IObjectSafetyDemo : IObjectSafety

{

  private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
  private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
  private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
  private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
  private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";

  private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
  private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
  private const int S_OK = 0;
  private const int E_FAIL = unchecked((int) 0x80004005);
  private const int E_NOINTERFACE = unchecked((int) 0x80004002);

  private bool _fSafeForScripting = true;
  private bool _fSafeForInitializing = true;

  public int GetInterfaceSafetyOptions(ref Guid riid,
                       ref int pdwSupportedOptions,
                       ref int pdwEnabledOptions)
  {
    int Rslt = E_FAIL;

    string strGUID = riid.ToString("B");
    pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
    switch(strGUID)
      {
    case _IID_IDispatch:
    case _IID_IDispatchEx:
      Rslt = S_OK;
      pdwEnabledOptions = 0;
      if (_fSafeForScripting == true)
        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
      break;
      case _IID_IPersistStorage:
      case _IID_IPersistStream:
      case _IID_IPersistPropertyBag:
        Rslt = S_OK;
        pdwEnabledOptions = 0;
        if (_fSafeForInitializing == true)
          pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
        break;
      default:
        Rslt = E_NOINTERFACE;
        break;
      }

    return Rslt;
  }

  public int SetInterfaceSafetyOptions(ref Guid riid,
                       int dwOptionSetMask,
                       int dwEnabledOptions)
  {
    int Rslt = E_FAIL;

    string strGUID = riid.ToString("B");
    switch(strGUID)
    {
      case _IID_IDispatch:
      case _IID_IDispatchEx:
    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&
         (_fSafeForScripting == true))
      Rslt = S_OK;
    break;
      case _IID_IPersistStorage:
      case _IID_IPersistStream:
      case _IID_IPersistPropertyBag:
    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&
         (_fSafeForInitializing == true))
      Rslt = S_OK;
    break;
      default:
    Rslt = E_NOINTERFACE;
    break;
    }

    return Rslt;
  }

}

ActiveX控件安全初始化之一:实现ISafeObject接口 ActiveX控件打包成cab后,在脚本中调用中时,要保证控件的安全性才能在你的网页上安全运行,有两种方法来实现这一保证:实现一个名称为IObjectSafe的接口到你的控件。如果IE发现你的控件支持IObjectSafety,它调用 IObjectSafety::SetInterfaceSafetyOptions 方法然后才载入你的控件。另外一种方法需要修改注册表,我将会在另外一篇文章中详细介绍 阅读详情

相关推荐

如何 IObjectSafety 标记 ATL 控件安全初始化

需要用来获得所需的功能在步骤涉及到 IObjectSafetyImpl 用作您的控件派生的类之一,和重写 GetInterfaceSafetyOptions 和 SetInterfaceSafetyOptions。 这使您实现所需的功能在这种情况下意味着将标记为可安全编写脚本和初始化该控件。 若要将 IObjectSafetyImpl 需要将其添加到您的控件派生的类的列表。 是例如多边形教程中您看到以下: class ATL_NO_VTABLE CPolyCtl : ... public IObjectSafetyImpl // 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 { public: BEGIN_COM_MAP(CPolyCtl) ... ,您将不必重写两个方法。 有关其他信息,单击下面,文章编号,以查看 Microsoft 知识库中相应: 192093 PRB: 编译器错误时移植到 ATL 3.0 IObjectSafetyImpl

IObjectSafety接口

都说ActiveX危险,那么为什么XmlHttpRequest以及MediaPlayer都是用ActiveX的方式创建的,却没有问题?原来,这是因为这些ActiveX组件都声明自己是脚本安全的,而IE的中级安全设置上,是允许脚本安全的ActiveX创建,并且不予警告的。IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。一是查询ActiveX组件是否实现了IObjectSafety接口,并且返

QustDong的专栏 1516

halcon 查找圆形

先找到大概位置进行拟合,然后再以拟合出的位置作为测量的大概位置进行找圆;

qq_59062726的博客 734

再谈IObjectSafety

都说ActiveX危险,那么为什么XmlHttpRequest以及MediaPlayer都是用ActiveX的方式创建的,却没有问题?原来,这是因为这些ActiveX组件都声明自己是脚本安全的,而IE的中级安全设置上,是允许脚本安全的ActiveX创建,并且不予警告的。IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。一是查询ActiveX组件是否实现了IObjectSafety接口,并

optman的专栏 2万+

IP路由原理、静态路由及动态路由区分

什么是路由 路由是指导IP报文发送的路径信息。 直连路由:目的地所在网络与路由器直接相连。 间接路由:目的地所在网络与路由器非直接相连。 静态路由是由管理员手工配置而生成的路由。 动态路由路由器使用路由协议从其他路由器那里获悉的路由。

weixin_42227328的博客 5470

用Python turtle库 绘制皮卡丘

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 turtle基础知识参考: https://gitchat.blog.youkuaiyun.com/article/details/90696190 https://blog.csdn.ne...

qq_36295856的博客 2万+

必须要实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件,可以不这样做的。可以把控件注册一下就可以了

必须要实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件,可以不这样做的。可以把控件注册一下就可以了。如果你实在看不懂 IObjectSafety接口的定义的话。可以这样做:RegistryKey rootKeyStair ,rootKeyTwo,rootKeyThree,rootKeyFour;   rootKeyStair = Registry.Clas

人生不要太仁慈 742

西门子S7-200 SMART PLC高速计数器与增量式编码器实战配置指南

在工业自动化控制系统中,传感器是将物理量转换为电信号的关键组件,其中编码器作为核心的位置与速度检测元件,其工作原理基于光电或磁电效应,将机械位移转换为脉冲序列。增量式编码器通过输出相位差90度的A/B两相脉冲,不仅能实现精确的位移测量,还能通过相位关系自动判别运动方向,并通过倍频技术提升分辨率。其技术价值在于为PLC等控制器提供了实时、高精度的位置反馈,是实现闭环控制、提升系统精度与可靠性的基础。在包装机械、物料输送、绕线设备等应用场景中,编码器与PLC高速计数器的协同工作是实现精确定位、定长切割与速度控制

weixin_29178069的博客 396

串口操作经验总结

对于串口通讯,如果时C/S版本的程序,由于是本地运行,故可以调用各种接口进行相关的操作,相对较为简单。 但对于B/S版本的程序,相对复杂一下。故总结此次操作的相关知识点,积累经验如下。

Andrewniu的博客 2476

PCL读取点云数据报错:Failed to find match for field ‘x‘/ ‘y‘/ ‘z‘.

原因:使用matlab生成的pcd文件,点云数据是双精度类型,pcl处理的点云数据是单精度类型。解决方案:使用matlab生成的点云坐标单精度化,然后在生成点云加以存储。

little_white138的博客 869

第3版•系统集成项目管理工程师(中级) │ 第12章 执行过程组 ✦ 管理沟通

🥏第3版•系统集成项目管理工程师(中级) │ 第12章 执行过程组 ✦ 管理沟通

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

关于IObjectSafety的思考

经常在网页里嵌入COM组件,而且为了避免IE的提示,我们常常让其实现IObjectSafety接口,以告诉IE说我是安全的,请不要提示啦!还真奇怪,IE就乖乖的听话,不提示了.我一直很怀疑微软这样做的道理是什么?因为COM对象只要实现这个接口,IE就相信它,这样还有什么意义呢?后来,我想明白了,因为COM组件在使用前需要首先安装/注册,这时候一般都需要用户进行参与,所以也算是用户同意和相信该COM

optman的专栏 1915

YOLOv11改进 | 检测头篇 | 利用动态蛇形卷积DySnakeConv改进yolov11分割检测头(全网独家首发,Segment)

本文给大家带来的最新改进机制是一种我进行优化的专用于分割的检测头,在分割的过程中,最困难的无非就是边缘的检测,动态蛇形卷积(Dynamic Snake Convolution)通过自适应地聚焦于细长和迂回的局部结构,准确地捕捉管状结构的特征。这种卷积方法的核心思想是,通过动态形状的卷积核来增强感知能力,针对管状结构的特征提取进行优化,所以将这个卷积针对于YOLOv11的分割头进行融合是非常合适的,当然本文的检测头也支持用于目标检测,但是我将其设计出来是主要为了分割的读者使用的。

Snu77的博客 3431

C#如何调用COM

这章中描述的属性被用在创建和COM程序交互的程序中。 1.1  COMImport 属性 当被放在一个类上, COMImport 属性就把这个类标记为一个外部实现的COM 类。这样的一个类声明使得可以用一个C# 名称调用一个COM 类。 1 namespace System.Runtime.InteropServices 2 { 3 [AttributeUsage(Attribute...

weixin_34318326的博客 1212

节省人力成本40%!仓储物流AI机器人调度系统实战案例(含路径规划算法与系统架构图)

首先,我们需要定义一个Node类self.x = x # 节点x坐标self.y = y # 节点y坐标self.g = g # 从起点到当前节点的实际成本(g值)self.h = h # 从当前节点到终点的启发式成本(h值)self.f = g + h # 总成本(f值)self.parent = None # 父节点(用于回溯路径)self.task_id = task_id # 任务IDself.priority = priority # 任务优先级(1=最高,5=最低)

小程序开发 950

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

使用VS2010 C#开发ActiveX控件(上)

最近做读卡器的B/S应用程序开发,由于读卡器厂商提供的手册都是C/S版本的,而且只有一个原始的Dll包,并没有web版的,那么就只好自己动手,丰衣足食了。 要开发Web版的读卡程序,大体思路如下: 1.使用C#对原始的Dll进行封装,这里要封装两部分内容,一部分是串口通信的功能,一部分是对卡读写的功能。 2.开发ActiveX控件...

weixin_30824599的博客 249

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ATL 实现IObjectSafety 接口

如果com组件要在IE中进行调用,则必须实现IObjectSafety接口,不然在ie中必须调整activex选项才可以正常运行,如下是实现IObjectSafety的例子:#include //////////////////////////////

sstower的专栏 5420

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ActiveX控件实现IobjectSafety接口

如果没有实现IobjectSafety接口浏览器会提示交互不安全等信息   打开工程名Ctl.h 搜索    class C工程名Ctrl : public COleControl 在其上面添加   #include  搜索    DECLARE_DYNCREATE(C工程名Ctrl) 下面添加 DECLARE_INTERFACE_MAP() BEGIN_I

xuweilmy的专栏 1089

IObjectSafety.txt

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ActiveX {     [ComImport, Guid("CB5BDC81-93C1-11CF-8F20

omniscience的专栏 547

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 776
上一篇: 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
下一篇: 在aspx中使用activex控件--结果让人很郁闷
Matrix0078
博客等级 码龄23年 126粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值