Como Retornar Corretamente um Array de Strings de um Objeto ActiveX para JScript

Se você está trabalhando com uma API Win32 e precisa retornar um array de strings de um objeto ActiveX para JScript, pode encontrar alguns desafios. Esse problema normalmente surge quando as strings parecem ‘perder-se’ durante a transferência. Compreender a relação entre objetos COM, ActiveX e JScript é crucial para um manuseio de dados bem-sucedido nesses ambientes. Neste post do blog, vamos explicar a abordagem correta para alcançar isso.

O Problema

Você definiu uma interface no seu arquivo IDL (Interface Definition Language) para um objeto COM que inclui um método que retorna um array de strings. Especificamente, a assinatura da função é a seguinte:

HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);

Embora a função em si funcione corretamente, o problema surge quando as strings são atribuídas a uma variável em JavaScript, resultando na aparente perda das strings. Precisamos garantir que os dados sejam transferidos corretamente.

A Solução

Para passar corretamente o array de strings do seu objeto ActiveX para JScript, siga estes passos detalhados:

Passo 1: Encapsular o SAFEARRAY em um VARIANT

Para facilitar a comunicação entre o objeto COM e JScript, você precisa encapsular o SAFEARRAY em um VARIANT antes de passá-lo de volta. Isso permite um manuseio adequado do array e garante que não ocorra perda de dados. Abaixo está o código da função modificado para conseguir isso:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
   // Declara uma variante para armazenar o array.
   _variant_t ret;
   // Define o tipo da variante como um array de variantes.
   ret.vt = VT_ARRAY | VT_VARIANT;
   ret.parray = rgBstrStringArray; // Atribui o SAFEARRAY.
   *pvarBstrStringArray = ret.Detach(); // Desanexa para retorno.
   return S_OK; // Retorna sucesso.
}

Passo 2: Usar VBArray em JScript

Após os dados serem encapsulados em um VARIANT e retornados com sucesso do ActiveX, você pode utilizar o objeto VBArray no seu código JScript para desempacotar os dados corretamente. A linha de código que você precisará é:

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray();

Essa única linha converte efetivamente o VARIANT retornado em um array de strings amigável ao JavaScript, permitindo que você manuseie os dados como necessário.

Conclusão

O manuseio da transferência de um array de strings de um objeto ActiveX para JScript depende da compreensão de como manipular objetos COM e interações JavaScript. Ao encapsular seu SAFEARRAY em um VARIANT e usar o VBArray para desempacotá-lo, você pode garantir que todos os dados sejam passados corretamente sem perda.

Agora, você deve estar equipado com a abordagem certa para retornar e utilizar arrays de strings em seus scripts administrativos. Feliz programação!