vbactivex控件:如何在VB中实现ActiveX控件的IobjectSafety接口-vb教程来源: 发布时间:星期四, 2009年2月12日 浏览:228次 评论:0
VB中实现ActiveXControl控件 -------------------------------------------------------------------------------- 总述 本文叙述了如何在VB中实现Control控件 请注意 相关信息: <此处略去了 现在开始循序渐进地举例介绍说明怎样创建 首先新建 从VB CD-ROM取得OLE 自动化类库 把下列内容拷贝到“记事本”中 [ uuid(C67830E0-D11D-11cf-BD80-00AA00575603), help version(1.0) ] library IObjectSafetyTLB { importlib(\"stdole2.tlb\"); [ uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064), help odl ] [help HRESULT GetInterfaceSafetyOptions( [in] long riid, [in] long *pdwSupportedOptions, [in] long *pdwEnabledOptions); [help HRESULT SetInterfaceSafetyOptions( [in] long riid, [in] long dwOptionsSetMask, [in] long dwEnabledOptions); } } 在命令行提示符下切换到项目文件夹 MKTYPLIB objsafe.odl /tlb objsafe.tlb 在VB中新建 打开菜单“工程->引用” 增加 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确保上述代码会被执行 打开Control控件代码窗口 Implements IObjectSafety 把下面两个过程代码拷贝到Control控件代码中: 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 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 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 保存后 0
相关文章
读者评论发表评论 |
