zoukankan      html  css  js  c++  java
  • VS 2010 开发 ActiveX 交互篇一

    JavaScript 调用 ActiveX 控件中的方法

    1. 在 InfoViewer 中添加一方法,用来弹出一个MessageBox

            public void Alert(string msg)
            {
                 MessageBox.Show(msg);
            }


    2. 修改 HTML 的代码

        <object id="inforViewer" classid="clsid:B3BCD23C-53EE-4661-83E0-559E5D022514"></object>
        <input type='button' onclick='inforViewer.Alert("Hello")' value='Click Me'>


    3. IE 中查看 Html 页面,此时点击 Click Me 按钮,并不会弹出一个MessageBox,在IE默认安全级别下,会阻止运行ActiveX


    4. 修改 IE 的本地安全级别为低或者添加至可信站点

    5. 刷新页面,再次点击 Click Me 按钮,会弹出询问窗口


    6. 选择是即可交互成功

     

    屏蔽调用ActiveX控件方法时弹出的询问窗口
    1. 添加一个接口 IObjectSafety,这个接口的代码不能改动

        [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);
        }


    2. InfoViewer 实现 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;
            }


    3. 重新编译项目,IE 中查看 Html 页面,点击 Click Me 按钮,已经不会再弹出询问窗口了

  • 相关阅读:
    CentOS 7配置LNMP开发环境及配置文件管理
    Virtual Box配置CentOS7网络(图文教程)
    HTTP常用状态码分析
    MySQL数据库和InnoDB存储引擎文件
    InnoDB关键特性学习笔记
    InnoDB体系结构学习笔记
    Laravel 5.x 请求的生命周期(附源码)
    PyQt5 signal and slot
    x01.gamelab: An Tank 3D Model
    x01.AntWorld: An Python AI Game
  • 原文地址:https://www.cnblogs.com/abccome/p/3344572.html
Copyright © 2011-2022 走看看