*继承IObjectSafety接口,实现vb activeX控件安全性(IE不提示安全问题)
原文http://support.microsoft.com/kb/182598/zh-cn
從 Visual Basic 6.0 CD-ROM(安裝目錄) 中獲取 OLE 自動化類型庫生成器。若要執(zhí)行此操作將所有四個文件從 /Common/Tools/VB/Unsupprt/Typlib/ 文件夾復制到您的項目文件夾中。
將以下文本復制到記事本,,將文件保存為 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
利用tlb注冊工具將文件注冊?
注冊工具可以在http://download.csdn.net/source/2841891下載到
從 Visual Basic 創(chuàng)建 ActiveX 控件項目
在 項目 菜單上單擊 引用 ,瀏覽到并添加 Objsafe.tlb,您早先創(chuàng)建的。
添加一個新的模塊到您的項目與下面的代碼并命名模塊 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確保上述代碼會被執(zhí)行。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, 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
生成.ocx控件,用web頁面引用。控件與頁面交互時IE不再提示安全問題。
總結(jié)
以上是生活随笔為你收集整理的*继承IObjectSafety接口,实现vb activeX控件安全性(IE不提示安全问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 改变图标!用户自定义列表样式css说明(
- 下一篇: 移动端做法。