如何在 Visual Basic 控件中实现 IObjectSafety

如何在 Visual Basic 控件中实现 IObjectSafety,第1张

概述下面的步骤说明如何创建一个简单的 Visual Basic 控件并将其标记为可安全执行脚本和 $ 初始化。 创建一个新的文件夹,您可以在其中保存创建此示例中的所有文件。 从 Visual Basic 6.0 CD-ROM 中获取 OLE 自动化类型库生成器。若要执行此 *** 作将所有四个文件从 \Common\Tools\VB\Unsupprt\Typlib\ 文件夹复制到您的项目文件夹中。注意: 从 下面的步骤说明如何创建一个简单的 Visual Basic 控件并将其标记为可安全执行脚本和 $ 初始化。 创建一个新的文件夹,您可以在其中保存创建此示例中的所有文件。 从 Visual Basic 6.0 CD-ROM 中获取 olE 自动化类型库生成器。若要执行此 *** 作将所有四个文件从 \Common\Tools\VB\Unsupprt\Typlib\ 文件夹复制到您的项目文件夹中。注意: 从 \VB5.0\Tools\Unsupprt\Typlib\ 可视 Basic 5.0 中的文件夹中复制所有文件。 将以下文本复制到记事本,,将文件保存为 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);           }       }					
在命令提示符使用 CD <path> 将移动到项目文件夹,然后键入以下命令来生成.tlb 文件的命令: MKTYPliB obJsafe.odl /tlb obJsafe.tlb 从 Visual Basic 创建 ActiveX 控件项目。在 属性 列表中项目的名称改为 IObJsafety 和 DemoCtl 到控件的名称。将名为 cmdTest 在控件上的命令按钮。在该 cmdTest 的 Click 事件处理中将 MsgBox"测试"语句放。 在 项目 菜单上单击 引用,浏览到并添加 ObJsafe.tlb,您早先创建的。 将一个新的模块添加到您的项目与下面的代码并命名模块 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 来执行该 Sub Main 上面的启动对象。使用 m_fSafeForScripting 和 m_fSafeForInitializing 变量指定的安全编写脚本和/或初始化变量的值。 打开您的控件的代码窗口。将下面的代码行添加到声明部分中,(右后选项显式或作为第一个):
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,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_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 文件中的控件。 总结

以上是内存溢出为你收集整理的如何在 Visual Basic 控件中实现 IObjectSafety全部内容,希望文章能够帮你解决如何在 Visual Basic 控件中实现 IObjectSafety所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1279111.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)