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

文章翻譯 文章翻譯
文章編號: 182598 - 檢視此文章適用的產品。
本文曾發行於 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 網站:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/installing_the_platform_sdk_with_visual_studio.asp
目前的 Platform SDK 並不包含 MkTypLib.exe 工具。如需隨附 Type Library Compiler (MkTypLib.exe) 的 Microsoft 產品資訊,請造訪下列的 Microsoft DLL Help 資料庫,並搜尋名為 MkTypLib.exe 的檔案。
http://support.microsoft.com/dllhelp
如需 MkTypLib 的叫用方法資訊,請參閱下列 Microsoft 網站:
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx
如需詳細資訊,請按一下下面的文件編號,檢視「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 網站:
http://msdn.microsoft.com/workshop/components/com/reference/ifaces/iobjectsafety/iobjectsafety.asp
如需安全地初始化與指令碼處理 ActiveX 控制項的詳細資訊,請參閱下列 Microsoft 網站:
http://msdn.microsoft.com/workshop/components/activex/safety.asp
如需開發 Microsoft Internet Explorer 的 Web 解決方案的詳細資訊,請造訪下列 Microsoft 網站:
http://msdn.microsoft.com/ie/

http://support.microsoft.com/iep

屬性

文章編號: 182598 - 上次校閱: 2006年9月18日 - 版次: 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
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com