如何在 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 网站: 有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
161873如何标记 MFC 控件对于脚本初始化的安全
143258如何创建类型库中的常数和 DLL 声明
131105示例: TYPEBLD: 如何使用 ICreateTypeLib 和 ICreateTypeInfo
有关 IObjectSafety 界面的详细信息,请参阅下面的 Microsoft 网站: 有关安全的初始化和脚本的 ActiveX 控件的详细信息请参阅下面的 Microsoft 网站: 有关为 Microsoft Internet Explorer 中开发的基于 Web 的解决方案的详细信息请访问以下 Microsoft 网站:
安全脚本持久性初始化

警告:本文已自动翻译

属性

文章 ID:182598 - 上次审阅时间:12/05/2015 08:28:57 - 修订版本: 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

  • kbnosurvey kbarchive kbmt kbfaq kbhowto KB182598 KbMtzh
反馈