本文叙述了如何在VB中实现控件的IobjectSafety接口,

以标志该控件是脚本安全和初始化安全的。
VB控件默认的处理方式是在注册表中注册组件类来标识其安全性,
但实现IobjectSafety接口是更好的方法。
本文包括了实现过程中所需的所有代码。

1、将以下文本复制到记事本, 并作为 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);
                         }
                     }
---------------------------------------------------------------------
2、在命令提示符处, 使用 CD < 路径 > 命令移到项目文件夹, 然后键入以下命令以生成 .tlb 文件:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
---------------------------------------------------------------------
3、在VB中新建一个ActiveX Control 项目。修改属性,把项目命名为IobjSafety,控件命名为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码 MsgBox "Test"
---------------------------------------------------------------------
4、在 项目 菜单上, 单击 引用 , 浏览并添加 Objsafe.tlb
---------------------------------------------------------------------
5、项目添加一个新模块并命名模块 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
---------------------------------------------------------------------
6、在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting 和m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。
8、打开控件的代码窗口。 将下列行的代码添加到声明部分 (OptionExplicit 后):
                        Implements IObjectSafety
---------------------------------------------------------------------
9、将下面两个过程复制到控件代码:
                    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
---------------------------------------------------------------------
10、在 文件 菜单上, 保存您的项目和文件。 生成 OCX 文件从项目。 现在您控件实现 IObjectSafety 接口。 要测试, 在一个 .htm 文件中插入控件。

相关连接:

http://topic.csdn.net/t/20050104/23/3699426.html

原理

IObjectSafety                 是一个接口,它可将其功能显露给                 Internet                 Explorer                 的“设置脚本安全性”和“设置初始化安全性”安全特性。对具有支持未受托客户(或那些不能预料其特定功能的,或不能确保安全使用的客户)接口的对象,例如 脚本,应当实现                 IObjectSafety                 接口。该接口允许您指定对象的哪一部分需要保护而不被使用。  
---------------------------------------------------------------------
                使用                 IObjectSafety                 可以将对象及其组成部分标记为以下三类:
                1、对未受托的                 Automation                 客户和脚本设置                 Automation                 安全性
                2、对未受托数据设置初始化安全性
                3、对未受托脚本设置运行安全性
---------------------------------------------------------------------
可以为您的对象考虑三种方案:
                1、 对象的所有属性和方法总是设置脚本安全性的。在该方案中,您可以通过不在 IObjectSafety_SetInterfaceSafetyOptions                 接口方法中返回错误来通知客户您的对象设置了脚本安全性。这样就能成功地创建和运行您的对象了。
                2、对象永不设置脚本安全性。在这种情况下,您可以通过在                 IObjectSafety_SetInterfaceSafetyOptions                 接口方法中返回一个错误,E_Fail                 来通知客户您的对象不安全。这样就防止了客户通过脚本来访问任何方法或属性了
                3、对象上的部分属性和方法,但不是全部,未设置脚本安全性。在这种情况下,您可以通知客户整个对象都不安全,也可以通知客户您的对象是安全的,但禁用不安全的属性和方法。
--------------------------------------------------------------------
TLB用于定义接口.   
                Implements                   在VB中继承并实现定义的                 接口.   
                IObjectSafety_GetInterfaceSafetyOptions   
                IObjectSafety_SetInterfaceSafetyOptions   
                是定义IObjectSafety的一个InterfaceSafetyOptions属性.要做的动作.
--------------------------------------------------------------------
[   
                                    uuid(C67830E0-D11D-11cf-BD80-00AA00575603),     
                                    helpstring("VB                 IObjectSafety                 Interface"),   
                                    version(1.0)   
                            ]   
    
                这是接口定义语言(IDL:Interface                 Definition                 Language),C67830E0-D11D-11cf-BD80-00AA00575603不可以任意写,它代表了IObjectSafety这个 接口,改了别人就找不到它了,如果创建一个新的类或接口,则可以任意写,就是一组16进制数,但一般都用GUIDGEN.EXE生成,可以保证不重复

转载于:https://www.cnblogs.com/JessieDong/archive/2009/12/07/1618762.html

VB控件实现IObjectSafety安全接口(zt)相关推荐

  1. 如何在VB中实现ActiveX控件的IobjectSafety接口

    如何在VB中实现ActiveX控件的IobjectSafety接口 ------------------------------------------------------------------ ...

  2. VB控件注册 - 利用资源文件将dll、ocx打包进exe文件

    很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到     现在介绍一下使用资源文件,将dll.ocx打包进exe,点击直接注册的例子: ...

  3. CAD制图,机械CAD,建筑CAD,电力CAD,CAD设计, CAD标注, 打印, 软件开发 ,VC++源代码,VB 控件源程序...

    CAD制图,机械CAD,建筑CAD,电力CAD,CAD设计, CAD标注, 打印, 软件开发 ,VC++源代码,VB 控件源程序 E-Form++可视化组件库集成最新最尖端的图形处理技术,全部采用VC ...

  4. 自动批量生成VB控件

    自动批量生成VB控件 内容 总结 代码 内容 最近想做一个象棋程序,想用Image控件来加载棋子,这样,每个格就要放一个Image控件,共要制作90个Image控件,如下图: 先别说一个一个画了,就是 ...

  5. 梦想CAD控件图块COM接口知识点

    梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...

  6. VB控件数组之操作技巧

    一.运行中设置数组控件的属性 设窗体上有若干个以 Command1 命名的命令按钮,现要求:点击其中一个按钮后,该按钮不可用,而其它的按钮均可用.以下几行代码可以实现这个要求,比一个一个的设置高效得多 ...

  7. VB 控件分类----内部控件;ActiveX 控件;可插入的对象

    控件分类,控件概述 时间:2009-6-18 20:19:33 点击:1158 控件分类 在Visual Basic中,控件可分成三类: 1.内部控件,例如 CommandButton 和 Frame ...

  8. Maps模块管理地图控件,用于在web页面中显示地图控件,提供各种接口操作地图控件,如添加标点、路线等。通过plus.maps可获取地图管理对象

    方法: openSysMap: 调用系统第三方程序进行导航 create: 创建Map对象 getMapById: 查找已经创建的Map对象 对象: Map: 地图控件对象 MapStyles: 地图 ...

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

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

最新文章

  1. Android studio Day01-23
  2. Facebook为其全球75%的用户推出反模仿工具
  3. 服务器声卡图标显示x,win10电脑中桌面扬声器图标显示X标记怎么修复
  4. 未来软件是什么样呢?数据库篇(转载)
  5. 七牛云——对象存储私有空间下载凭证认证失败401[“error“:“download token auth failed“]解决方案
  6. java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)
  7. arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
  8. 难得好图|水墨国画56个民族插画
  9. windows python安装包_Python-3.9安装包(windows版)
  10. 把握linux内核设计思想系列【转】
  11. 阿里巴巴大规模稀疏模型训练/预测引擎 DeepRec 正式开源
  12. 【人话版】WEB3黑暗森林中的隐私博弈
  13. 中班音乐计算机反思,中班音乐游戏打字机教案反思
  14. 无法导入某些项目,因为它们已经存在于Eclipse中的工作区错误中
  15. 犹太民族与基督的真相!
  16. Python Scapy 愚弄入侵检测系统
  17. c语言课设雷霆战机编程,C语言写的雷霆战机
  18. 公式编辑器如何使用详细图解
  19. 超分文章记录 SRCNN-FSRCNN-ESPCN-VDCN-DRCN-RDN-LapSRN-SRDenseNet-SRGAN
  20. Android kotlin 大全

热门文章

  1. 计算机人文英语1形考答案,国家开放大学电大《人文英语1》形考任务七试题及答案...
  2. 一文读懂计算机组成,一文读懂为什么要做动态心电图检查?
  3. 刚刚随便GOOGLE和BAIDU了下PIPO和BLOG
  4. 黄明:国际投行向华兜售“金融鸦片”
  5. 讨论JAVA和QT之争
  6. 设计一个jsp页面,要求在网页上显示当前日期和时间,如果时间在6:00~12:00,输出“上午好”:如果时间在12:00 18:00, 输出“下午好”:
  7. 设置win7文件夹背景和图标
  8. mysql add months,mysql里有没有类似oracle里的ADD_MONTHS函数,自能的提取间隔的月份...
  9. 中国经济学家与管理学家的错位
  10. 刘润年度演讲2022:进化的力量(演讲全文)