Como faço para retornar uma matriz de strings de um objeto ActiveX para JScript

StackOverflow https://stackoverflow.com/questions/45169

  •  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?­­­­­­­­­­­­­­­­­­­­­­­­

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top