您目前已離線,請等候您的網際網路重新連線

如何在 Visual Basic 控制項中實作 IObjectSafety

本文曾發行於 CHT182598
結論
本文將告訴您,如何在 Visual Basic 控制項中實作 IObjectSafety 介面,標記可安全進行指令碼處理與初始化的控制項。根據預設,Visual Basic 控制項會使用登錄中的元件類別項目,標記可安全進行指令碼處理與初始化的控制項。實作 IObjectSafety 介面是比較好的方法。本文列出在 Visual Basic 控制項中實作此介面所需的所有程式碼。

請記住,只有真正安全的控制項,才可以標記為安全控制項。本文並不會詳細說明如何標記可安全進行指令碼處理與初始化的控制項;本文僅示範如何以程式碼執行此項作業。如需詳細說明,請參閱《Internet Client Software Development Kit (SDK)》說明文件中,<Component Development>一節底下的<Safe Initialization and Scripting for ActiveX Controls>。
其他相關資訊
警告:本文討論下列一或多種函式:VarPtr、VarPtrArray、VarPtrStringArray、StrPtr 和 ObjPtr。Microsoft 技術支援部門不支援這些函式。Visual Basic 的說明文件中並未提到這些函式,這些函式資訊是在本「知識庫」文件中以「現狀」提供。Microsoft 不保證在 Visual Basic 未來版本中會有這些函式可用。如需有關這些函式的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
199824 How To Get the Address of Variables in Visual Basic
下列步驟說明如何建立一個簡單的 Visual Basic 控制項,並將它標記為可安全進行指令碼處理與初始化的控制項。
  1. 建立一個新資料夾,用來存放本範例所建立的所有檔案。
  2. 從 Visual Basic 光碟片取得 OLE Automation Type Library Generator,方法是將 \Common\Tools\VB\Unsupprt\Typlib\ 資料夾內的四個檔案全部複製到您的專案資料夾。
  3. 將下列文字複製到「記事本」,然後將檔案命名為 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);           }       }					
  4. 在命令提示字元中,使用 CD <path> 命令移動至專案資料夾,並且輸入下列命令以產生 .tlb 檔案:
    MKTYPLIB objsafe.odl /tlb objsafe.tlb
  5. 從 Visual Basic 建立一個「ActiveX 控制項」專案。在 [屬性] 清單中,將專案名稱改為 IObjSafety,再將控制項名稱改為 DemoCtl。在控制項上放置一個名為 cmdTest 的 CommandButton。在 cmdTest 的 Click 事件處理常式中,放置一個 MsgBox "Test" 陳述式。
  6. [專案] 功能表上按一下 [參考],瀏覽至您稍早建立的 Objsafe.tlb,將它加入。
  7. 在專案中新增一個新模組,然後將下列程式碼加入該模組,並將模組命名為 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					
  8. 從 [專案屬性] 將 [啟始物件] 改成 [Sub Main] 以執行上面的 Sub Main。使用 m_fSafeForScriptingm_fSafeForInitializing 變數來指定可安全進行指令碼處理與/或初始化變數的值。
  9. 開啟控制項的程式碼視窗。將下行程式碼新增至 [宣告] 區段 (就在 Option Explicit 之後或是第一行):
    Implements IObjectSafety					
  10. 將下列兩個程序複製到控制項程式碼中:
          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					
  11. [檔案] 功能表上,儲存您的專案與檔案。建立專案的 OCX 檔。現在,您的控制項已實作 IObjectSafety 介面。如果要測試此介面,請將控制項插入 .htm 檔案中。
参考
MkTypLib.exe 這個工具原本隨附於 Microsoft Visual Studio 6.0 的 Platform Software Development Kit (SDK)。如需 Visual Studio 6.0 隨附的 Platform SDK 的安裝資訊,請參閱下列 Microsoft 網站: 目前的 Platform SDK 並不包含 MkTypLib.exe 工具。如需隨附 Type Library Compiler (MkTypLib.exe) 的 Microsoft 產品資訊,請造訪下列的 Microsoft DLL Help 資料庫,並搜尋名為 MkTypLib.exe 的檔案。 如需 MkTypLib 的叫用方法資訊,請參閱下列 Microsoft 網站:如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
161873 How to mark MFC ActiveX controls as Safe for Scripting and Initializationh
143258 How To Create Constants and DLL Declarations in a Type Library
131105 SAMPLE:TYPEBLD:How to Use ICreateTypeLib & ICreateTypeInfo
如需 IObjectSafety 介面的詳細資訊,請參閱下列 Microsoft 網站: 如需安全地初始化與指令碼處理 ActiveX 控制項的詳細資訊,請參閱下列 Microsoft 網站:如需開發 Microsoft Internet Explorer 的 Web 解決方案的詳細資訊,請造訪下列 Microsoft 網站:
safety scripting persistence initialization
內容

文章識別碼:182598 - 最後檢閱時間:09/18/2006 08:39:00 - 修訂: 6.0

  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer (Programming) 5.01 SP1
  • Microsoft Internet Explorer 5.5
  • kbhowto kbfaq KB182598
意見反應