VB控件实现IObjectSafety安全接口(zt)
以標(biāo)志該控件是腳本安全和初始化安全的。
VB控件默認(rèn)的處理方式是在注冊(cè)表中注冊(cè)組件類(lèi)來(lái)標(biāo)識(shí)其安全性,
但實(shí)現(xiàn)IobjectSafety接口是更好的方法。
本文包括了實(shí)現(xiàn)過(guò)程中所需的所有代碼。
1、將以下文本復(fù)制到記事本, 并作為 objsafe.odl 項(xiàng)目文件夾以保存文件:
??????????????????? [
??????????????????????? 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);
???????????????????????? }
???????????????????? }
---------------------------------------------------------------------
2、在命令提示符處, 使用 CD < 路徑 > 命令移到項(xiàng)目文件夾, 然后鍵入以下命令以生成 .tlb 文件:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
---------------------------------------------------------------------
3、在VB中新建一個(gè)ActiveX Control 項(xiàng)目。修改屬性,把項(xiàng)目命名為IobjSafety,控件命名為DemoCtl。在控件上放置一個(gè)按鈕,命名為cmdTest,在它的Click事件中加入一句代碼 MsgBox "Test"
---------------------------------------------------------------------
4、在 項(xiàng)目 菜單上, 單擊 引用 , 瀏覽并添加 Objsafe.tlb
---------------------------------------------------------------------
5、項(xiàng)目添加一個(gè)新模塊并命名模塊 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
---------------------------------------------------------------------
6、在工程屬性中把啟動(dòng)對(duì)象改成Sub Main確保上述代碼會(huì)被執(zhí)行。m_fSafeForScripting 和m_fSafeForInitializing兩件變量的值分別指定了腳本安全和初始化安全取值。
8、打開(kāi)控件的代碼窗口。 將下列行的代碼添加到聲明部分 (OptionExplicit 后):
??????????????????????? Implements IObjectSafety
---------------------------------------------------------------------
9、將下面兩個(gè)過(guò)程復(fù)制到控件代碼:
??????????????????? 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
---------------------------------------------------------------------
10、在 文件 菜單上, 保存您的項(xiàng)目和文件。 生成 OCX 文件從項(xiàng)目。 現(xiàn)在您控件實(shí)現(xiàn) IObjectSafety 接口。 要測(cè)試, 在一個(gè) .htm 文件中插入控件。
相關(guān)連接:
http://topic.csdn.net/t/20050104/23/3699426.html????????????????
? 原理
??????????????? IObjectSafety???????????????? 是一個(gè)接口,它可將其功能顯露給???????????????? Internet???????????????? Explorer???????????????? 的“設(shè)置腳本安全性”和“設(shè)置初始化安全性”安全特性。對(duì)具有支持未受托客戶(或那些不能預(yù)料其特定功能的,或不能確保安全使用的客戶)接口的對(duì)象,例如 腳本,應(yīng)當(dāng)實(shí)現(xiàn)???????????????? IObjectSafety???????????????? 接口。該接口允許您指定對(duì)象的哪一部分需要保護(hù)而不被使用。??---------------------------------------------------------------------
??????????????? 使用???????????????? IObjectSafety???????????????? 可以將對(duì)象及其組成部分標(biāo)記為以下三類(lèi):
??????????????? 1、對(duì)未受托的???????????????? Automation???????????????? 客戶和腳本設(shè)置???????????????? Automation???????????????? 安全性
??????????????? 2、對(duì)未受托數(shù)據(jù)設(shè)置初始化安全性
??????????????? 3、對(duì)未受托腳本設(shè)置運(yùn)行安全性
---------------------------------------------------------------------
可以為您的對(duì)象考慮三種方案:
??????????????? 1、 對(duì)象的所有屬性和方法總是設(shè)置腳本安全性的。在該方案中,您可以通過(guò)不在 IObjectSafety_SetInterfaceSafetyOptions???????????????? 接口方法中返回錯(cuò)誤來(lái)通知客戶您的對(duì)象設(shè)置了腳本安全性。這樣就能成功地創(chuàng)建和運(yùn)行您的對(duì)象了。
??????????????? 2、對(duì)象永不設(shè)置腳本安全性。在這種情況下,您可以通過(guò)在???????????????? IObjectSafety_SetInterfaceSafetyOptions???????????????? 接口方法中返回一個(gè)錯(cuò)誤,E_Fail???????????????? 來(lái)通知客戶您的對(duì)象不安全。這樣就防止了客戶通過(guò)腳本來(lái)訪問(wèn)任何方法或?qū)傩粤?br /> ??????????????? 3、對(duì)象上的部分屬性和方法,但不是全部,未設(shè)置腳本安全性。在這種情況下,您可以通知客戶整個(gè)對(duì)象都不安全,也可以通知客戶您的對(duì)象是安全的,但禁用不安全的屬性和方法。
--------------------------------------------------------------------
TLB用于定義接口.???
??????????????? Implements?????????????????? 在VB中繼承并實(shí)現(xiàn)定義的???????????????? 接口.???
??????????????? IObjectSafety_GetInterfaceSafetyOptions???
??????????????? IObjectSafety_SetInterfaceSafetyOptions???
??????????????? 是定義IObjectSafety的一個(gè)InterfaceSafetyOptions屬性.要做的動(dòng)作.
--------------------------------------------------------------------
[???
??????????????????????????????????? uuid(C67830E0-D11D-11cf-BD80-00AA00575603),?????
??????????????????????????????????? helpstring("VB???????????????? IObjectSafety???????????????? Interface"),???
??????????????????????????????????? version(1.0)???
??????????????????????????? ]???
????
??????????????? 這是接口定義語(yǔ)言(IDL:Interface???????????????? Definition???????????????? Language),C67830E0-D11D-11cf-BD80-00AA00575603不可以任意寫(xiě),它代表了IObjectSafety這個(gè) 接口,改了別人就找不到它了,如果創(chuàng)建一個(gè)新的類(lèi)或接口,則可以任意寫(xiě),就是一組16進(jìn)制數(shù),但一般都用GUIDGEN.EXE生成,可以保證不重復(fù)
轉(zhuǎn)載于:https://www.cnblogs.com/JessieDong/archive/2009/12/07/1618762.html
總結(jié)
以上是生活随笔為你收集整理的VB控件实现IObjectSafety安全接口(zt)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 国内外云ERP市场厂商大盘点
- 下一篇: docker 批量删除镜像