Cómo implementar IObjectSafety en los controles de Visual Basic

Seleccione idioma Seleccione idioma
Id. de artículo: 182598 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

En este artículo se describe cómo implementar la interfaz IObjectSafety en los controles de Visual Basic para marcarlos como seguros en el uso de secuencias de comandos y en la inicialización. De forma predeterminada, los controles de Visual Basic utilizan entradas de componentes de categoría para ello. El mejor método es implementar la interfaz IObjectSafety. Este artículo contiene todo el código requerido para implementar esta interfaz en los controles de Visual Basic.

Tenga en cuenta que un control sólo debe marcarse como seguro si realmente lo es. En este artículo no se describen los detalles acerca de cómo se marcan los controles como seguros en el uso de secuencias de comandos y en la inicialización, simplemente se nuestra cómo se pude hacer con código. Para obtener una descripción detallada, vea la documentación del Kit de desarrollo de software (SDK) del cliente de Internet (Internet Client Software Development Kit). Vea "Inicialización y secuencias de comandos seguras para controles Active X" en la sección Desarrollo de componentes.

Más información

ADVERTENCIA: algunas de las funciones siguientes se explican en este artículo: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr y ObjPtr. El Servicio de soporte técnico de Microsoft no ofrece soporte de estas funciones. No aparecen en la documentación de Visual Basic, y en este artículo de Microsoft Knowledge Base se usan con esta limitación. Microsoft no garantiza que vayan a estar disponibles en futuras versiones de Visual Basic. Para obtener información adicional acerca de estas funciones, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
199824 Cómo obtener la dirección de las variables en Visual Basic
Los siguientes pasos ilustran cómo crear un control sencillo de Visual Basic y marcarlo como seguro para el uso en secuencias de comandos y en la inicialización.
  1. Cree una carpeta nueva donde pueda guardar todos los archivos que cree en este ejemplo.
  2. Obtenga el generador de la biblioteca de tipos de automatización OLE del CD-ROM de Visual Basic 6.0. Para ello, copie los cuatro archivos de la carpeta \Common\Tools\VB\Unsupprt\Typlib\ a la carpeta del proyecto. Nota: Copie todos los archivos de la carpeta \VB5.0\Tools\Unsupprt\Typlib\ en Visual Basic 5.0.
  3. Copie el siguiente texto en el Bloc de notas y guarde el archivo en la carpeta de proyecto como 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. En un símbolo del sistema, utilice el comando CD <rutaDeAcceso> para desplazarse a la carpeta de proyecto y escriba el comando siguiente para generar un archivo .tlb:
    MKTYPLIB objsafe.odl /tlb objsafe.tlb
  5. Desde Visual Basic, cree un proyecto de control ActiveX. En la lista Propiedades, cambie el nombre del proyecto por IObjSafety y el nombre del control por DemoCtl. Sitúe un botón de comando (CommandButton) denominado cmdTest en el control. En el controlador de eventos Click de cmdTest, coloque una instrucción MsgBox de prueba, "Test".
  6. En el menú Proyecto, haga clic en Referencias y busque y agregue el archivo Objsafe.tlb que creó con anterioridad.
  7. Agregue un módulo nuevo al proyecto mediante el siguiente código y asígnele el nombre basSafeCtl:
          Option Explicit      Public Const IID_IDispatch = &amp;quot;{00020400-0000-0000-C000-000000000046}&amp;quot;      Public Const IID_IPersistStorage = _        &amp;quot;{0000010A-0000-0000-C000-000000000046}&amp;quot;      Public Const IID_IPersistStream = _        &amp;quot;{00000109-0000-0000-C000-000000000046}&amp;quot;      Public Const IID_IPersistPropertyBag = _        &amp;quot;{37D84F60-42CB-11CE-8135-00AA004BB851}&amp;quot;      Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &amp;amp;H1      Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &amp;amp;H2      Public Const E_NOINTERFACE = &amp;amp;H80004002      Public Const E_FAIL = &amp;amp;H80004005      Public Const MAX_GUIDLEN = 40      Public Declare Sub CopyMemory Lib &amp;quot;kernel32&amp;quot; Alias &amp;quot;RtlMoveMemory&amp;quot; _         (pDest As Any, pSource As Any, ByVal ByteLen As Long)      Public Declare Function StringFromGUID2 Lib &amp;quot;ole32.dll&amp;quot; (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. En Propiedades del proyecto, cambie el objeto de inicio (Startup) por Sub Main para ejecutar la sección Sub Main anterior. Utilice las variables m_fSafeForScripting y m_fSafeForInitializing para especificar los valores de seguridad de las variables de secuencias de comandos y/o inicialización.
  9. Abra la ventana de código del control. Agregue la siguiente línea de código en la sección de declaraciones (inmediatamente después de Option Explicit o en primer lugar):
    Implements IObjectSafety					
  10. Copie los siguientes dos procedimientos al código de los controles:
          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 &amp;lt;&amp;gt; 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 &amp;lt;&amp;gt; 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) &amp;lt;&amp;gt; _                   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) &amp;lt;&amp;gt; _                    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. En el menú Archivo, guarde el proyecto y los archivos. Cree un archivo OCX desde el proyecto. Ahora el control implementa la interfaz IObjectSafety. Para probarlo, inserte el control en un archivo .htm.

Referencias

MkTypLib.exe es una herramienta antigua que se incluía anteriormente con el kit de desarrollo de software (SDK) de la plataforma que viene con Microsoft Visual Studio 6.0. Para obtener información acerca de cómo instalarlo, visite el sitio Web de Microsoft siguiente:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/installing_the_platform_sdk_with_visual_studio.asp
El SDK de la plataforma actual no se incluye con la herramienta MkTypLib.exe. Para obtener más información de los productos de Microsoft que incluyen el compilador de la biblioteca de tipos (Type Library Compiler o MkTypLib.exe), consulte la siguiente base de datos de la Ayuda de Microsoft DLL y busque el nombre de archivo MkTypLib.exe
http://support.microsoft.com/dllhelp
Para obtener más información acerca de cómo invocar a MkTypLib, visite el siguiente sitio Web de Microsoft:
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx
Para obtener información adicional al respecto, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
161873 Cómo marcar los controles MFC como seguros para scripts e inicialización
143258 Cómo crear constantes y declaraciones DLL en una biblioteca de tipos
131105 EJEMPLO: TYPEBLD: Cómo usar ICreateTypeLib e ICreateTypeInfo
Para obtener más información acerca de la interfaz IObjectSafety, visite el siguiente sitio Web de Microsoft (en inglés):
http://msdn.microsoft.com/workshop/components/com/reference/ifaces/iobjectsafety/iobjectsafety.asp
Para obtener más información acerca de la inicialización segura y la creación de secuencias de comandos (scripts) para los controles ActiveX, visite el sitio Web de Microsoft siguiente:
http://msdn.microsoft.com/workshop/components/activex/safety.asp
Para obtener más información acerca de cómo desarrollar soluciones basadas en Web para Microsoft Internet Explorer, visite los siguientes sitios Web de Microsoft:
http://msdn.microsoft.com/ie/

http://support.microsoft.com/iep

Propiedades

Id. de artículo: 182598 - Última revisión: viernes, 20 de octubre de 2006 - Versión: 5.0
La información de este artículo se refiere a:
  • 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 Edición empresarial
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Service Pack 1 de Microsoft Internet Explorer 4.01
  • 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
Palabras clave: 
kbhowto kbfaq KB182598

Enviar comentarios

 

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