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!