DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 182598 - Última revisão: terça-feira, 16 de outubro de 2007 - Revisão: 5.3

 

Sumário

Este artigo descreve como implementar a interface IObjectSafety em controles do VisualBasic para marcar os controles seguros para inicialização e script. Por padrão, controles do VisualBasic usam componente categoria entradas no registro para marcar o controle seguro para inicialização e script. O método preferido é implementar a interface IObjectSafety. Este artigo contém todo o código necessário para implementar essa interface em controles do VisualBasic.

Por favor, tenha em mente que um controle deve apenas ser marcado como seguro se for, na verdade, seguro. Este artigo não descrever os detalhes da marcação controles como seguro para inicialização e script; simplesmente demonstra como fazer no código. Consulte a documentação do Internet Client Software Development Kit (SDK) para uma descrição detalhada. Consulte "Segurança inicialização e scripts para ActiveX Controls" sob a seção de desenvolvimento de componentes.

Mais Informações

Aviso: um ou mais das seguintes funções são discutidas neste artigo: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr e. Essas funções não são suportadas pelo suporte técnico da Microsoft. Eles não são documentados na documentação do Visual Basic e são fornecidos neste artigo do Knowledge Base "como"está. A Microsoft não garante que eles estarão disponíveis em versões futuras do Visual Basic. Para obter informações adicionais sobre essas funções, clique no número abaixo para ler o artigo na Base de dados de Conhecimento:
199824  (http://support.microsoft.com/kb/199824/EN-US/ ) Como obter o endereço de variáveis no Visual Basic
As seguintes etapas ilustram como criar um simples controle VisualBasic e marcar seguros para inicialização e script.
  1. Crie uma nova pasta onde você pode salvar todos os arquivos que você criar neste exemplo.
  2. Obtenha o gerador OLE Automation biblioteca a partir do CD do Visual Basic 6.0. Para fazer isso, copie todos os quatro arquivos da pasta \Common\Tools\VB\Unsupprt\Typlib\ para sua pasta de projeto. Observação: copiar todos os arquivos da pasta \VB5.0\Tools\Unsupprt\Typlib\ no VIsual Basic 5.0.
  3. Copie o seguinte texto no bloco de notas e salve o arquivo na pasta de projeto 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. Em um prompt de comando, use o CD <path><caminho> comando para mover para a pasta de projeto e digite o seguinte comando para gerar um arquivo .tlb:
    MKTYPLIB objsafe.odl /tlb objsafe.tlb
  5. A partir do Visual Basic, crie um projeto ActiveX Control. Na lista de Propriedades, altere o nome do projeto para IObjSafety e o nome do controle para DemoCtl. Coloque um CommandButton chamado cmdTest no controle. No manipulador de eventos Click do cmdTest, coloque uma instrução "Test" MsgBox.
  6. No menu Project, clique em referências, procure e adicionar Objsafe.tlb, criada anteriormente.
  7. Adicionar um novo módulo ao seu projeto 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. Propriedades, altere Startup Object Sub Main para executar o Sub Main acima. Use variáveis m_fSafeForScripting e m_fSafeForInitializing para especificar os valores de seguro para as variáveis de script e/ou inicialização.
  9. Abra a janela de código do seu controle. Adicionar a linha de código a seguir à seção Declaração (à direita após Option Explicit ou como a primeira):
    Implements IObjectSafety
    					
  10. Copiar os dois procedimentos a seguir para seu código de 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 <> 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 arquivo, salve seu projeto e arquivos. Criar um arquivo OCX partir seu projeto. Agora, seu controle implementa a interface IObjectSafety. Para testá-la, insira o controle em um arquivo .htm.

Referências

MkTypLib.exe é uma ferramenta antiga previamente fornecidos com o Platform Software Development Kit (SDK) que vem com o Microsoft Visual Studio 6.0. O atual Platform SDK não vem com a ferramenta MkTypLib.exe.

Para obter informações sobre como invocar MkTypLib, consulte o seguinte site:
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx (http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx)
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento:
161873  (http://support.microsoft.com/kb/161873/EN-US/ ) Como marcar MFC controles seguros para script/inicialização
143258  (http://support.microsoft.com/kb/143258/EN-US/ ) Como criar declarações de DLL e constantes em uma biblioteca
131105  (http://support.microsoft.com/kb/131105/EN-US/ ) EXEMPLO: TYPEBLD: como utilizar ICreateTypeLib e ICreateTypeInfo
Para obter mais informações sobre a interface IObjectSafety, consulte o seguinte site:
http://msdn.microsoft.com/en-us/library/aa911729.aspx (http://msdn.microsoft.com/en-us/library/aa911729.aspx)
Para obter mais informações sobre inicialização segura e os scripts para controles ActiveX, consulte o seguinte site:
http://msdn2.microsoft.com/en-us/library/Aa751977.aspx (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:
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)

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 Edição de 128 Bits
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer 5.5
Palavras-chave: 
kbmt kbfaq kbhowto KB182598 KbMtpt
Tradução automáticaTraduçã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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 182598  (http://support.microsoft.com/kb/182598/en-us/ )
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store