VB中实现IObjectSafety接口以声明控件安全的方法

转载自:http://www.cnblogs.com/Shana/archive/2009/06/24/VB_Iobjsafe.html

VB编写的ActiveX控件,在被Javascript脚本调用时会弹出讨厌的对话框,警告用户即将运行不安全的ActiveX脚本,因此必须要实现IObjectSafety接口以声明控件是脚本安全的,下面是具体方法:

1. 新建一个目录作为你的工程目录;

2. 插入VB的安装盘,进入%安装盘根目录%\COMMON\TOOLS\VB\UNSUPPRT\TYPLIB,将里面的4个文件C1.EXE、CL.EXE、MKTYPLIB.EXE、MSPDB41.DLL拷贝到刚才的工程目录中;

3. 打开记事本,粘贴下面的代码然后另存为objsafe.odl,保存在工程目录中;

[
          uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
          helpstring("VB IObjectSafety Interface"),
          version(1.0)
      ]
      library IObjectSafetyTLB
      {
          importlib("stdole2.tlb");
          [
              uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
              helpstring("IObjectSafety Interface"),
              odl
          ]
          interface IObjectSafety:IUnknown {
              [helpstring("GetInterfaceSafetyOptions")]
              HRESULT GetInterfaceSafetyOptions(
                        [in]  long  riid,
                        [in]  long *pdwSupportedOptions,
                        [in]  long *pdwEnabledOptions);

[helpstring("SetInterfaceSafetyOptions")]
              HRESULT SetInterfaceSafetyOptions(
                        [in]  long  riid,
                        [in]  long  dwOptionsSetMask,
                        [in]  long  dwEnabledOptions);
           }
       }

4. 运行cmd进入命令行,利用CD命令进入工程目录,然后输入以下命令并回车:

MKTYPLIB objsafe.odl /tlb objsafe.tlb

5. 进入Visual Basic,新建ActiveX空间工程。在属性菜单里,将工程名修改为IObjSafety,控件名修改为DemoCtl。给空间中添加一个按钮,并在这个按钮的点击事件里加入一句:MsgBox "Test";

6. 在"工程"菜单里点击"引用",接着点浏览,然后选择加入Objsafe.tlb;

7. 给你的工程添加一个模块,模块的代码如下,模块名称为basSafeCtl;

Option Explicit

Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"
      Public Const IID_IPersistStorage = _
        "{0000010A-0000-0000-C000-000000000046}"
      Public Const IID_IPersistStream = _
        "{00000109-0000-0000-C000-000000000046}"
      Public Const IID_IPersistPropertyBag = _
        "{37D84F60-42CB-11CE-8135-00AA004BB851}"

Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
      Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
      Public Const E_NOINTERFACE = &H80004002
      Public Const E_FAIL = &H80004005
      Public Const MAX_GUIDLEN = 40

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
         (pDest As Any, pSource As Any, ByVal ByteLen As Long)
      Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _
         Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long

Public Type udtGUID
          Data1 As Long
          Data2 As Integer
          Data3 As Integer
          Data4(7) As Byte
      End Type

Public m_fSafeForScripting As Boolean
      Public m_fSafeForInitializing As Boolean

Sub Main()
          m_fSafeForScripting = True
          m_fSafeForInitializing = True
      End Sub

8. 修改工程属性,将启动项改为Sub_Main;

9. 在你自己的控件中,在Option Explicit后加入一行:Implements IObjectSafety;

10. 给你的控件中加入下面的代码:

Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
      Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)

Dim Rc      As Long
          Dim rClsId  As udtGUID
          Dim IID     As String
          Dim bIID()  As Byte

pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
                                INTERFACESAFE_FOR_UNTRUSTED_DATA

If (riid <> 0) Then
              CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)
              Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
              Rc = InStr(1, bIID, vbNullChar) - 1
              IID = Left$(UCase(bIID), Rc)

Select Case IID
                  Case IID_IDispatch
                      pdwEnabledOptions = IIf(m_fSafeForScripting, _
                    INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)
                      Exit Sub
                  Case IID_IPersistStorage, IID_IPersistStream, _
                     IID_IPersistPropertyBag
                      pdwEnabledOptions = IIf(m_fSafeForInitializing, _
                    INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)
                      Exit Sub
                  Case Else
                      Err.Raise E_NOINTERFACE
                      Exit Sub
              End Select
          End If
      End Sub

Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
      Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)
          Dim Rc          As Long
          Dim rClsId      As udtGUID
          Dim IID         As String
          Dim bIID()      As Byte

If (riid <> 0) Then
              CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)
              Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
              Rc = InStr(1, bIID, vbNullChar) - 1
              IID = Left$(UCase(bIID), Rc)

Select Case IID
                  Case IID_IDispatch
                      If ((dwEnabledOptions And dwOptionsSetMask) <> _
                   INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then
                          Err.Raise E_FAIL
                          Exit Sub
                      Else
                          If Not m_fSafeForScripting Then
                              Err.Raise E_FAIL
                          End If
                          Exit Sub
                      End If

Case IID_IPersistStorage, IID_IPersistStream, _
                IID_IPersistPropertyBag
                      If ((dwEnabledOptions And dwOptionsSetMask) <> _
                    INTERFACESAFE_FOR_UNTRUSTED_DATA) Then
                          Err.Raise E_FAIL
                          Exit Sub
                      Else
                          If Not m_fSafeForInitializing Then
                              Err.Raise E_FAIL
                          End If
                          Exit Sub
                      End If

Case Else
                      Err.Raise E_NOINTERFACE
                      Exit Sub
              End Select
          End If
      End Sub

11. 在"文件"菜单中点击"生成ocx文件",ok,现在你的控件已经是脚本安全的了,可以直接使用js脚本进行调用了。

VB中实现IObjectSafety接口以声明控件安全的方法相关推荐

  1. VB调用C#写的WinForm.NET控件

    点击下载本文配套的演示程序代码http://files.cnblogs.com/xdesigner/VB-CS-WinformControl.zip. 一.前言: 虽然IT开发技术日新月异,不过业界仍 ...

  2. vb数据库编程(二)--数据控件

    什么是绑定控件?绑定控件指的是一个窗体上的"对象",由于创建它的那个控件设置了显示数据库信息方面的功能,通过设置对象的datasource(数据源)属性和datafield(数据字 ...

  3. vb.net 教程 3-10 窗体编程 datagridview控件 3 禁止追加行 与 禁止删除行

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 如<vb.net 教程 3-10 窗体编程 datagridview控件 1 初步 > ...

  4. android bind 自动声明控件,Android注解神器ButterKnife使用说明

    阅读本文大概需要5分钟 前言 如果你还在一行一行的手写findViewById的话,只能证明你对新技术的敏感度太差,间接地暴露了你不善于接受新事物的性格特征,太过于因循守旧.按部就班,这对于一个程序员 ...

  5. 在DWZ框架中整合kindeditor复文本框控件

    今天上午在DWZ框架中整合kindeditor复文本框控件,发现上传图片是老是提示 "上传中,请稍候...",上网查看别人说可能是文件路径问题,在想以前在其他项目中用这个控件一直没 ...

  6. html asp textbox,ASP.NET中 TextBox 文本输入框控件的使用方法

    TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属性 说明 AutoPostBack 获 ...

  7. [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?

    [html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...

  8. qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示

    ---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...

  9. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...

最新文章

  1. 前端学习(1258):then参数中的函数返回值
  2. protobuf2和3同时安装_安装protobuf可能遇到的问题
  3. 美国大学计算机专业排名2014,2014年美国大学计算机科学专业排名
  4. 计算数学与数学理论专栏【简介】
  5. 营销任何产品都只解决2个功能
  6. 用socket发送流数据示--用 php://input? 接受post数据(可实现php和c/c++数据通讯)
  7. blog.1z5k.com
  8. PowerDesigner16工具学习笔记-建立CDM
  9. 十大经典排序算法-堆排序算法详解
  10. Web开发框架——Zheng
  11. 自由修改机型名称、手机型号工具-QQ微博尾巴装X神器
  12. ClickOnce 通过URL传递参数
  13. HTML+CSS3(六)——行内元素和块级元素
  14. 展馆人流量怎么测算?
  15. Linux traceroute no reply
  16. CsvHelper文档-1前言
  17. 组合类和友员类的差异有哪些(C++)
  18. 有道云笔记常用快捷键
  19. Qt cef3 无边框程序最小化之后,再打开 hover 状态失效
  20. 10款最佳项目管理工具推荐,总有一款适合你

热门文章

  1. 【FinE】在险价值(VaR)计算
  2. 机器人军团防护罩_冒险岛贴吧 - 1000A导轨保护罩Y轴保护盖板的简单介绍
  3. Python爬虫技巧一之设置ADSL拨号服务器代理
  4. 「区块链系列」区块链技术与应用
  5. TIOBE 2月编程语言排行榜出炉:Python遥遥领先C语言
  6. js实现kmp算法_基于KMP算法JavaScript的实现方法分析
  7. android手机能用ios吗,安卓手机真的可以刷苹果iOS系统吗?
  8. java months between,java 8-chronounit.months.between(fromdate,todate)不能按预期工作
  9. 王姨劝我学HarmonyOS鸿蒙2.0系列教程之五布局方法点击响应!
  10. n719 rom 卡刷 android 4.3,三星 N719 官方 4.3 精简 纯净 刷机包 ROM