`
huanlong78
  • 浏览: 33966 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

全文转载,以备不时之需.

    博客分类:
  • VB
阅读更多

 

全文转载,以备不时之需.

 

 

 

如何在VB中实现ActiveX控件的IobjectSafety接口     选择自 foolishtiger 的 Blog

 

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q182598

 

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

--------------------------------------------------------------------------------

总述

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

请注意,控件只有确确实实是安全的,才能被标识为“安全的”。本文并未论及如何确保控件的安全性,这个问题请参阅Internet Client Software Development Kit (SDK)中的相关文档 "Safe Initialization and Scripting for ActiveX Controls",它在Component Development 栏目中。

 

相关信息:

<此处略去了一段也许无关紧要的警告>

现在开始循序渐进地举例说明怎样创建一个简单的VB控件,以及怎样将它标识为脚本安全和初始化安全。

首先新建一个文件夹来存放在本例中所产生的文件。

从VB CD-ROM取得OLE 自动化类库的制作工具。将VB安装光盘中\Common\Tools\VB\Unsupprt\Typlib\目录下所有内容一并拷贝到前面新建的项目文件夹中。

 

把下列内容拷贝到“记事本”中,然后保存到上述文件夹,文件名为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);

           }

       }

 

在命令行提示符下切换到项目文件夹,输入下列命令创建一个.tlb 文件:

 

MKTYPLIB objsafe.odl /tlb objsafe.tlb 

在VB中新建一个ActiveX Control 项目。修改属性,把项目命名为IobjSafety,控件命名为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码 MsgBox "Test" 。

 

打开菜单“工程->引用”,点“浏览”,找到刚刚建立的Objsafe.tlb,把它加入到引用中。

 

增加一个新module名为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

 在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting 和m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。

 

打开控件代码窗口,在声明部分加入如下代码(如果有Option Explicit语句,当然要保证代码放在其后):

 

     Implements IObjectSafety

    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

 

把下面两个过程代码拷贝到控件代码中:

 

 

保存后,把工程编译成OCX文件。现在控件已经实现了IObjectSafety 接口。在.htm中加入这件控件试一试吧。

 

作者Blog:http://blog.csdn.net/foolishtiger/

相关文章

PDA下应用EVB开发的几点问题

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

VB中文件操作的两种方式

 

 

 

 

附带上   证书制作工具  ,  打包工具( need JDK - -!)


分享到:
评论

相关推荐

    期货大词典:期现货人士必收藏,以备不时之需.doc.pdf

    期货大词典:期现货人士必收藏,以备不时之需.doc

    VirtualBox-6.1.2-135663-Win - 副本.exe.7z

    VirtualBox-6.1.2-135663-Win.exe 官网下载很慢很慢,备份到这里以备不时之需. VirtualBox-6.1.2-135663-Win.exe 官网下载很慢很慢,备份到这里以备不时之需. VirtualBox-6.1.2-135663-Win.exe 官网下载很慢很慢,...

    万能驱动器,以备不时之需

    万能驱动器,可在线升级,下载了以备不时之需。

    实现table排序(以备不时之需)

    本篇将围绕"实现table排序(以备不时之需)"这一主题,详细讲解如何利用jQuery及其插件来实现表格数据的动态排序。 首先,我们看到标签中提到了"源码"和"工具",这意味着我们将探讨一段具体的代码和可能使用的工具...

    转载40种转载40种网页常用小技巧(javascript)--备不时之需(javascript)--备不时之需

    取消选取文本以防止复制 ```html ``` 设置 `onselectstart` 事件可以阻止用户选中文本进行复制,这对于保护版权内容非常有用。 ### 3. 阻止粘贴操作 ```javascript onpaste="return false" ``` 此属性可以禁止...

    kubectl.exe

    源地址下载缓慢,上传到这里备份,以备不时之需.

    H3C常用命令学习以备不时之需

    H3C

    滤波电路大全收藏以备不时之需 硬件工程师电路分析物联网模电单片机嵌入式技术.doc

    滤波电路是电子工程中的重要组成部分,特别是在单片机、嵌入式系统、...无论是硬件工程师在设计新产品时,还是学生在学习电路分析时,都需要深入理解和掌握滤波电路的工作原理和应用技巧,以应对不断变化的技术挑战。

    js的正则表达式 总结;自己的一个总结;以备不时之需

    //技巧 所谓$表示以什么结尾,应当是排除了^部分后剩下的 //技巧 要匹配一个固定的数则直接 写就可以.如果要匹配一个字母则 \a \.这样. //技巧 +号表示(1-多) *号表示(0-多) ?号表示(0-1) //验证一个ip...

    eXeScope破解汉化版

    eXeScope专业脱壳工具,方便大家使用,以备不时之需. 是一款专业的编程软件,exescope 汉化版小巧但功能极其强大的本地化工具,exescope可以直接修改 VC++ 及 DELPHI 编制的 PE 格式文件的资源,包括菜单、对话框、...

    collection-pictures:收集一些好看的图片,以备不时之需

    描述中提到的“收藏图片”和“收集一些好看的图片,以备不时之需”暗示了这是一个图片储备库,用户可以在需要的时候从中挑选合适的图片。目录部分提到的“背景”可能指的是项目设立的初衷或者是图片分类的一种,比如...

    老人安全知识必备家庭消防.doc

    配备小型灭火器和防火逃生工具,以备不时之需。 5. 厨房用电安全:避免湿手接触电器,电源保险丝不可用铜丝替代,应使用适合的保险丝。灯头使用螺口并安装安全罩,可移动电器使用后拔掉插头,避免长时间通电。 6. ...

    后备干部培养计划参照.pdf

    【后备干部培养计划详解】 ...这个后备干部培养计划是一个系统性、全面性的策略,它不仅关注人才的选拔,还重视人才的长期发展,通过多种途径提升后备干部的综合素质,以备不时之需,从而保障企业的稳定和长远发展。

    系统灾备技术基础概述.pdf

    1.4.1 备份:备份是将数据和应用程序的当前状态复制到另一个存储介质或地点,以备不时之需。常见的备份策略有全量备份、增量备份和差异备份。 1.4.2 容灾:容灾系统是在主系统之外建立的,可以在灾难发生时立即接替...

    大一新生入学必备物品有哪些.docx

    3. 身份证及其复印件:正反两面各复印4份,以备不时之需。 4. 户口本复印件:户主页和本人页各4份,部分学校可能会要求。 5. 团员档案和学籍档案:这两项非常重要,不要忘记带上,且学籍档案不能开封。 6. 免冠照片...

    commons-javaflow-20060411.jar

    传一下jar包,找不到jar包时就下载吧,方便大家不时之需.

    TotalRecorder_8.4.4990

    其工作原理是在电脑中建立一个虚拟声卡,从而对电脑中的任何声音进行截取,其效果非常好,下载之后安装即可,目前本人用了很久但一直没发现需要注册激活,不过,为了防止万一,现提供几组可注册数据,以备不时之需!...

    CocosBuilder3.5.zip备份已被不时之需

    8. **扩展性**:CocosBuilder允许开发者通过插件扩展其功能,以满足特定项目需求,如添加自定义的行为或特效。 9. **版本控制**:作为一个重要的备份,CocosBuilder3.5.zip可能包含版本控制信息,这使得团队协作和...

    大学新生必备物品清单(你带了没有?).pdf

    12. 鞋子:至少两双,以备不时之需。 13. 夹衣架:寝室共享,数量宜多。 14. 粘钩:用于晾晒衣物或挂置物品。 15. 吹风机:虽是违规电器,但在雨季非常有用,可谨慎使用。 这份清单旨在帮助新生全面考虑所需物品,...

    SqlLocalDB.msi

    SqlLocalDB.msi sqlserver数据库。20180821上传一份,以备不时之需

Global site tag (gtag.js) - Google Analytics