Como implementar IObjectSafety no Visual Basic controlos

Traduções de Artigos Traduções de Artigos
Artigo: 182598 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve como implementar a interface IObjectSafety nos controlos do Visual Basic para marcar os controlos seguros para inicialização e scripts. Por predefinição, controlos de Visual Basic utilizam componente categoria entradas no registo para marcar o controlo seguro para inicialização e scripts. Implementar a interface IObjectSafety é o método preferido. Este artigo contém todo o código que é necessário para implementar esta interface no Visual Basic controlos.

Não se esqueça de que um controlo deve apenas ser assinalado como sendo como seguro se for, na realidade, seguro. Este artigo não descreve os detalhes de marcar controlos como seguros para inicialização e scripts; ele simplesmente demonstra como fazê-lo no código. Por favor consulte a documentação do Internet Client Software Development Kit (SDK) para obter uma descrição detalhada deste. Consulte "Segurança inicialização e scripts para controlos ActiveX" na secção de desenvolvimento de componentes.

Mais Informação

Aviso: um ou mais das seguintes funções são abordados neste artigo: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr e. Estas funções não são suportadas pelo suporte técnico da Microsoft. Eles não estão documentados na documentação do Visual Basic e são fornecidos neste artigo da base de dados de conhecimento "tal como"está. A Microsoft não garante que estarão disponíveis em versões futuras do Visual Basic. Para obter informações adicionais sobre estas funções, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
199824Como obter o endereço de variáveis no Visual Basic
Os passos seguintes ilustram como criar um controlo do Visual Basic simples e marcá-lo seguro para inicialização e scripts.
  1. Crie uma nova pasta onde pode guardar todos os ficheiros que criar neste exemplo.
  2. Obter o gerador de biblioteca de tipos de automatização OLE a partir do CD-ROM do Visual Basic 6.0. Para o fazer, copie os quatro ficheiros da pasta \Common\Tools\VB\Unsupprt\Typlib\ para a pasta de projecto. Nota: copiar todos os ficheiros da pasta \VB5.0\Tools\Unsupprt\Typlib\ do VIsual Basic 5.0.
  3. Copie o seguinte texto no bloco de notas e guarde o ficheiro na pasta do projecto 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. Na linha de comandos, utilize o CD de <path><caminho> comando para mover para a pasta de projecto e escreva o seguinte comando para gerar um ficheiro .tlb:
    MKTYPLIB objsafe.odl /tlb objsafe.tlb
  5. A partir do Visual Basic, crie um projecto de controlo ActiveX. Na lista de Propriedades, altere o nome do projecto para IObjSafety e o nome do controlo para DemoCtl. Coloque um CommandButton chamado cmdTest no controlo. No processador de evento clicar do cmdTest, coloque uma instrução de MsgBox "Teste".
  6. No menu projecto, clique em References, navegue para e adicione Objsafe.tlb criado anteriormente.
  7. Adicionar um novo módulo de projecto com o seguinte código e, nome basSafeCtl módulo:
          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. A partir das propriedades do projecto, altere o objecto de arranque para Sub Main para executar a sub main acima. Utilize as variáveis de m_fSafeForScripting e m_fSafeForInitializing para especificar os valores de seguro para as variáveis e/scripts ou inicialização.
  9. Abra a janela de código do controlo. Adicione a seguinte linha de código para a secção de declaração (logo após Option Explicit ou como o primeiro):
    Implements IObjectSafety
    					
  10. Copie os dois procedimentos que se seguem para o código de controlos:
          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. No menu ficheiro, guarde o projecto e os ficheiros. Criar um ficheiro OCX do projecto. O controlo agora implementa a interface IObjectSafety. Para o testar, insira o controlo num ficheiro .htm.

Referências

MkTypLib.exe é uma ferramenta antiga que anteriormente enviados com o Platform Software Development Kit (SDK) que é fornecido com o Microsoft Visual Studio 6.0. O actual Platform SDK não ficar com a ferramenta de MkTypLib.exe.

Para obter informações sobre como invocar MkTypLib, consulte o seguinte site da Microsoft:
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx
Para obter informações adicionais, clique nos números de artigo existentes abaixo para visualizar os artigos na base de dados de conhecimento da Microsoft:
161873Como marcar MFC controlos seguros para inicialização/scripts
143258Como criar constantes e declarações de DLL numa biblioteca de tipos
131105EXEMPLO: TYPEBLD: como utilizar ICreateTypeLib e ICreateTypeInfo
Para mais informações sobre a interface IObjectSafety, consulte o seguinte site da Microsoft:
http://msdn.microsoft.com/en-us/library/aa911729.aspx
Para mais informações sobre seguros de inicialização e scripts para controlos ActiveX, consulte o seguinte site da Microsoft:
http://msdn2.microsoft.com/en-us/library/Aa751977.aspx
Para obter mais informações sobre como desenvolver soluções baseadas na Web para o Microsoft Internet Explorer, visite os seguintes sites da Microsoft:
http://msdn.microsoft.com/ie/

http://support.microsoft.com/iep

Propriedades

Artigo: 182598 - Última revisão: 16 de outubro de 2007 - Revisão: 5.3
A informação contida neste artigo aplica-se 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 Enterprise Edition for Windows 6.0
  • 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
Palavras-chave: 
kbmt kbfaq kbhowto KB182598 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 182598

Submeter comentários

 

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