PROBLEMA: Erro de script ocorre ao referenciar matriz non-variant

Traduções deste artigo Traduções deste artigo
ID do artigo: 165967 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Sintomas

Quando um script tenta referenciar os elementos de uma matriz retornada por um componente, o mecanismo de script relatórios:
<object>"Objeto não oferece suporte a esta propriedade ou método ' <objeto>. <method> '"

Causa

O mecanismo de script ativo da VBSCRIPT fornecido pela Microsoft só oferece suporte a indexação de SAFEARRAYs de VARIANTs. Enquanto VBSCRIPT é capaz de aceitar matrizes do tipo non-variant para fins de verificação de limite e passando a automação de outra objetos, o mecanismo não permite a manipulação do conteúdo da matriz no momento.

O mecanismo de script ativo JSCRIPT não oferece suporte para testar os limites ou indexação SAFEARRAYs de qualquer tipo incluindo VARIANTs. No entanto, JSCRIPT é capaz de passar SAFEARRAYs de um objeto de automação para outro.

Resolução

Para funcionar corretamente com aplicativos e componentes que hospedam o VBSCRIPT, objetos de automação devem criar SAFEARRAYs de VARIANTs. Dados não-VARIANT devem ser empacotados nos elementos VARIANT do SAFEARRAY a ser retornado para o mecanismo do VBSCRIPT.

Scripts escritos em VBSCRIPT devem usar a função TypeName para verificar o tipo de dados de uma variável. A função TypeName retorna a seqüência de caracteres "Variant()", excluindo cotações, quando passada uma matriz de VARIANTs.

Scripts escritos em JSCRIPT devem usar o operador typeof para testar o tipo de dados de uma variável. O operador typeof retorna a seqüência de caracteres "desconhecido", excluindo as aspas para tipos de dados não suportados por JSCRIPT.

Situação

Esse comportamento é por design.

Mais Informações

O VBSARRAY é um simples ATL (Active Template Library) versão 2.1 objeto de componente que demonstra esse comportamento. O componente implementa uma interface dupla Ivbsa suporta três métodos: TestBstrs, TestVariants e TestPassArray. A primeira demonstra o problema, retornando um SAFEARRAY de BSTRs. O segundo demonstra a solução por embalagem cada BSTRs em um VARIANT. A terceira demonstra que uma matriz do tipo VARIANT não pode ser passada do componente para VBSCRIPT ou JSCRIPT para componente. Os dados permanecerão intactos.

Aqui é a implementação do TestVariants:
      // Return a VARIANT array of VARIANTs which hold BSTRs
      STDMETHODIMP Cvbsa::TestVariants(VARIANT * pvaVariant)
      {
         HRESULT hr = NOERROR;
         LPSAFEARRAY psa;
         SAFEARRAYBOUND rgsabound[]  = { 3, 0 }; // 3 elements, 0-based
         int i;

         if (!pvaVariant)
         {
            return E_INVALIDARG;
         }

         VariantInit(pvaVariant);

         psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
         if (!psa)
         {
            return E_OUTOFMEMORY;
         }

         VARIANT vFlavors[3];
         for (i = 0; i < 3; i++)
         {
            VariantInit(&vFlavors[i]);
            V_VT(&vFlavors[i]) = VT_BSTR;
         }

         V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
         V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
         V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip"));
         if (!V_BSTR(&vFlavors[0]) || !V_BSTR(&vFlavors[1]) ||
             !V_BSTR(&vFlavors[2]))
         {
            hr = E_OUTOFMEMORY;
            goto Error;
         }

         {
                //Plug references to the data into the SAFEARRAY
               LPVARIANT rgElems;
               if (FAILED(hr = SafeArrayAccessData(psa,(LPVOID*)&rgElems)))

            {
               goto Error;
            }
            for (i = 0; i < 3; i++)
            {
               rgElems[i] = vFlavors[i];
            }
            SafeArrayUnaccessData(psa);
         }

         V_VT(pvaVariant) = VT_ARRAY | VT_VARIANT;
         V_ARRAY(pvaVariant) = psa;

         return NOERROR;

   Error:
         for (i = 0; i < 3; i++)
         {
            if (V_BSTR(&vFlavors[i])
            {
               VariantClear(&vFlavors[i]);
            }
         }
         return hr;
   }
				
aqui está o código JSCRIPT VBSARRAY.HTM, a página de teste incluída com o exemplo, que verifica o tipo de dados de uma variável:
      <SCRIPT LANGUAGE=JSCRIPT>
      function JScriptSafeArrayTest()
      {
         pvaBstr = SimpleComponent.TestBstrs()
         if (typeof(pvaBstr) == "unknown")
         {
            Alert("JSCRIPT cannot handle the type returned by TestBstrs()")
            SimpleComponent.TestPassedArray(pvaBstr)
         }

         pvaVariant = SimpleComponent.TestVariants()
         if (typeof(pvaVariant) == "unknown")
         {
         Alert("JSCRIPT cannot handle the type returned by TestVariants()")
            SimpleComponent.TestPassedArray(pvaVariant)
         }
      }
      </SCRIPT>
				
Para demonstrar o problema e a solução, execute as seguintes etapas:

  1. Siga as instruções abaixo sobre como obter o componente de exemplo VBSARRAY.DLL e página VBSARRAY.HTM de exemplo.
  2. Registre o componente VBSARRAY.DLL usando uma ferramenta como o Regsvr32.exe.
  3. Iniciar o Internet Explorer e o teste de carga página VBSARRAY.HTM.
  4. Siga as instruções na página, clicando em vários botões e observar o comportamento resultante.
O componente de exemplo foi criado usando a versão 2.1 incluindo com Visual C++ 5.0 no Visual Studio 97 ambiente do Active Template Library. Se você tiver o Visual Studio 97, você pode carregar o projeto VBSARRAY diretamente. Caso contrário, você pode abrir o arquivo de origem relevantes VBSA.CPP em qualquer editor para ver como o SAFEARRAY é construído tanto a VARIANT a BSTR casos. Procure a implementação de Cvbsa::TestVariants e Cvbsa::TestBstrs no arquivo de origem.

Os seguintes arquivos estão disponíveis para download no Centro de download da Microsoft:
Vbsarray.exe
Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Referências

Referência de automação do SDK de plataforma

Microsoft Visual Basic Scripting Edition Language Reference

Propriedades

ID do artigo: 165967 - Última revisão: domingo, 6 de outubro de 2013 - Revisão: 4.2
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic, Scripting Edition 1.1
  • Visual Basic, Scripting Edition 2.0
  • Visual Basic, Scripting Edition 3.0
  • Microsoft JScript 1.0
  • Microsoft JScript 2.0
  • Microsoft Internet Explorer 4.0 Edição de 128 Bits
  • Microsoft Active Server Pages 4.0
Palavras-chave: 
kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 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 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: 165967

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