PROBLEMA: Erro de script ocorre quando fizer referência ao matriz variante não

Traduções de Artigos Traduções de Artigos
Artigo: 165967 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Sintomas

Quando um script tentativas referenciar os elementos de uma matriz devolvida por um componente, o motor de script relatórios:
"Objecto não suporta esta propriedade ou método ' <object>. <method> '"

Causa

O VBSCRIPT activo motor de script fornecido pela Microsoft apenas suporta a indexação SAFEARRAYs de VARIANTs. Enquanto o VBSCRIPT é capaz de aceitar matrizes do tipo de variante não para efeitos de verificação de limite e passar para outra automatização objectos, o motor não permite a manipulação de índice de matriz neste momento.

O motor de scripts activo JSCRIPT não fornece suporte para testar os limites ou indexação SAFEARRAYs de qualquer tipo incluindo VARIANTs. No entanto, o JSCRIPT é capaz de transmitir SAFEARRAYs de um objecto de automatização para outro.

Resolução

Para funcionar correctamente com aplicações e componentes que hospedam o VBSCRIPT, objectos de automatização devem criar SAFEARRAYs de VARIANTs. Dados VARIANT não devem ser fornecidos nos elementos VARIANT do SEGURA a serem devolvidos ao motor VBSCRIPT.

Scripts escritos em VBSCRIPT devem utilizar a função NomeTipo para verificar o tipo de dados de uma variável. A função NomeTipo devolve a cadeia "Variant()", excluindo as propostas, quando uma matriz de VARIANTs.

Scripts escritos em JSCRIPT devem utilizar o operador typeof para testar o tipo de dados de uma variável. O operador typeof devolve a cadeia "desconhecido", excluindo as aspas para tipos de dados não suportados pelo JSCRIPT.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

O VBSARRAY é uma biblioteca de modelo Active Directory (ATL) simples versão 2.1 objecto de componente que demonstre este comportamento. O componente implementa uma interface dupla Ivbsa suporta três métodos: TestBstrs, TestVariants e TestPassArray. A primeira demonstra o problema, devolvendo um SEGURA do BSTRs. O segundo demonstra a solução por compactar cada BSTRs numa VARIANT. A terceira demonstra que uma matriz do tipo VARIANT não pode ser transmitida de componente para VBSCRIPT ou JSCRIPT ao componente. Os dados permanecem intactos.

Aqui é a implementação da 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 é o código JSCRIPT a partir do 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 os seguintes passos:

  1. Siga as instruções abaixo sobre como obter o componente de exemplo VBSARRAY.DLL e página VBSARRAY.HTM de exemplo.
  2. Registe o componente VBSARRAY.DLL utilizando uma ferramenta como, por exemplo, 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 utilizando a biblioteca de modelo de Active Directory versão 2.1 incluindo Visual C++ 5.0 no Visual Studio ambiente 97. Se tiver o Visual Studio 97, pode carregar projecto VBSARRAY directamente. Caso contrário, pode abrir o ficheiro de origem relevantes VBSA.CPP em qualquer editor para ver como a SEGURA é construída tanto o VARIANT do BSTR casos. Procure a implementação de Cvbsa::TestVariants e Cvbsa::TestBstrs no ficheiro de origem.

Os ficheiros seguintes estão disponíveis para transferência a partir do Centro de transferências da Microsoft:
Vbsarray.exe
Para obter informações adicionais sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591Como obter ficheiros de suporte da Microsoft a partir de serviços on-line
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada que o ajudam a impedir alterações não autorizadas ao ficheiro.

Referências

Plataforma SDK Automation Reference

Microsoft Visual Basic Scripting Edition Language Reference

Propriedades

Artigo: 165967 - Última revisão: 13 de fevereiro de 2014 - 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 128-Bit Edition
  • 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 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: 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