Como faço para retornar uma matriz de strings de um objeto ActiveX para JScript
-
09-06-2019 - |
Pergunta
Preciso chamar uma API Win32 para obter uma série de strings e gostaria de retornar uma matriz dessas strings para JavaScript.Isto é para scripts executados na máquina local para scripts de administração, não para o navegador da web.
Meu arquivo IDL para o objeto COM tem a interface que estou chamando como:
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);
A função retorna corretamente, mas as strings ficam 'perdidas' quando são atribuídas a uma variável em JavaScript.
A questão é:Qual é a maneira correta de retornar a matriz de strings para uma variável JavaScript?
Solução
Se bem me lembro, você precisará embrulhar o SAFEARRAY
em um VARIANT
para que ele passe e, em seguida, use um Objeto VBArray para descompactá-lo no lado JS:
HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
// ...
_variant_t ret;
ret.vt = VT_ARRAY|VT_VARIANT;
ret.parray = rgBstrStringArray;
*pvarBstrStringArray = ret.Detach();
return S_OK;
}
então
var jsFriendlyStrings = new VBArray( axOb.GetArrayOfStrings() ).toArray();
Outras dicas
Shog9está correto.O script COM exige que todas as saídas sejam VARIANTES.
Na verdade, também exige que todos os ENTRADAS seja VARIANTES também - veja os detalhes desagradáveis do IDispatch em seu arquivo de ajuda favorito.Pensa-se apenas na magia da implementação de interface dupla por ATL e camadas semelhantes (que provavelmente é o que você está usando) que você não precisa se preocupar com isso.As VARIANTs de entrada passadas pelo código de chamada são convertidas para corresponder à assinatura do seu método antes que o método real seja chamado.