
[ 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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)