如何在 Visual Basic 控件中实现 IObjectSafety

文章翻译 文章翻译
文章编号: 182598 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

本文介绍如何将控件标记为可安全执行脚本和 $ 初始化的 Visual Basic 控件中实现 IObjectSafety 接口。默认状态下,Visual Basic 控件使用组件类别项在注册表中将控件标记为脚本编写和初始化安全。实现 IObjectSafety 接口是首选的方法。本文包含在 Visual Basic 控件中实现此接口所需的所有代码。

请记住控件应只标记为安全,如果它是,事实上,安全。本文不介绍标记为可安全编写脚本和初始化的控件的详细信息 ; 它只是说明如何在代码中。请有关详细说明此 Internet 客户端软件开发工具包 (SDK) 文档,参阅。在组件开发部分下,请参阅"安全初始化和脚本的 ActiveX 控件"。

更多信息

警告: 在这篇文章中讨论了一个或多个下列功能: VarPtr,VarPtrArray,VarPtrStringArray StrPtr,和 ObjPtr。这些函数不受 Microsoft 技术支持。它们不记录在 Visual Basic 文档并提供了这篇知识库文章"按原样。Microsoft 不能保证它们将在将来的版本的 Visual Basic 中可用。有关这些功能的其他信息,请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
199824如何在 Visual Basic 中获取变量的地址
下面的步骤说明如何创建一个简单的 Visual Basic 控件并将其标记为可安全执行脚本和 $ 初始化。
  1. 创建一个新的文件夹,您可以在其中保存创建此示例中的所有文件。
  2. 从 Visual Basic 6.0 CD-ROM 中获取 OLE 自动化类型库生成器。若要执行此操作将所有四个文件从 \Common\Tools\VB\Unsupprt\Typlib\ 文件夹复制到您的项目文件夹中。注意: 从 \VB5.0\Tools\Unsupprt\Typlib\ 可视 Basic 5.0 中的文件夹中复制所有文件。
  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. 在命令提示符使用 CD <path> 将移动到项目文件夹,然后键入以下命令来生成.tlb 文件的命令:
    MKTYPLIB objsafe.odl /tlb objsafe.tlb
  5. 从 Visual Basic 创建 ActiveX 控件项目。在 属性 列表中项目的名称改为 IObjSafetyDemoCtl 到控件的名称。将名为 cmdTest 在控件上的命令按钮。在该 cmdTest 的 Click 事件处理中将 MsgBox"测试"语句放。
  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 来执行该 Sub Main 上面的启动对象。使用 m_fSafeForScriptingm_fSafeForInitializing 变量指定的安全编写脚本和/或初始化变量的值。
  9. 打开您的控件的代码窗口。将下面的代码行添加到声明部分中,(右后选项显式或作为第一个):
    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 文件。您的控件现在实现 IObjectSafety 接口。若要其测试插入一个.htm 文件中的控件。

参考

MkTypLib.exe 是以前提供与该平台软件开发工具包 (SDK) 附带 Microsoft Visual Studio 6.0 了旧工具。当前平台 SDK 不会使用 MkTypLib.exe 工具。

有关如何调用 MkTypLib 请参阅下面的 Microsoft 网站:
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
161873如何标记 MFC 控件对于脚本初始化的安全
143258如何创建类型库中的常数和 DLL 声明
131105示例: TYPEBLD: 如何使用 ICreateTypeLib 和 ICreateTypeInfo
有关 IObjectSafety 界面的详细信息,请参阅下面的 Microsoft 网站:
http://msdn.microsoft.com/en-us/library/aa911729.aspx
有关安全的初始化和脚本的 ActiveX 控件的详细信息请参阅下面的 Microsoft 网站:
http://msdn2.microsoft.com/en-us/library/Aa751977.aspx
有关为 Microsoft Internet Explorer 中开发的基于 Web 的解决方案的详细信息请访问以下 Microsoft 网站:
http://msdn.microsoft.com/ie/

http://support.microsoft.com/iep

属性

文章编号: 182598 - 最后修改: 2007年10月16日 - 修订: 5.3
这篇文章中的信息适用于:
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 专业版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 5.0 企业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 5.0 学习版
  • Microsoft Visual Basic 6.0 学习版
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer (Programming) 5.01 SP1
  • Microsoft Internet Explorer 5.5
关键字:?
kbmt kbfaq kbhowto KB182598 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 182598
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com