Domanda

Devo chiamare un'API Win32 per ottenere una serie di stringhe e vorrei restituire un array di tali stringhe a JavaScript.Questo è per lo script eseguito sul computer locale per gli script di amministrazione, non per il browser web.

Il mio file IDL per l'oggetto COM ha l'interfaccia che sto chiamando come:

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

La funzione restituisce correttamente, ma le stringhe vengono "perse" quando vengono assegnate a una variabile in JavaScript.

La domanda è:Qual è il modo corretto per ottenere la matrice di stringhe restituita a una variabile JavaScript?­­­­­­­­­­­­­­­­­­­­­­­­

È stato utile?

Soluzione

Se ricordo bene, dovrai avvolgere il SAFEARRAY in un VARIANT affinché possa passare, quindi utilizzare a Oggetto VBArray per decomprimerlo dal lato JS delle cose:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
   // ...

   _variant_t ret;
   ret.vt = VT_ARRAY|VT_VARIANT;
   ret.parray = rgBstrStringArray;
   *pvarBstrStringArray = ret.Detach();
   return S_OK;
}

Poi

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

Altri suggerimenti

Shog9è corretta.Lo scripting COM richiede che tutti gli output siano VARIANTI.

In effetti, richiede anche che tutti i file INGRESSI essere anche VARIANTI: guarda i dettagli sgradevoli di IDispatch nel tuo file di aiuto preferito.Si pensa solo alla magia dell'implementazione della doppia interfaccia di ATL e livelli simili (che molto probabilmente è quello che stai utilizzando) che non devi preoccuparti di questo.Le VARIANT di input passate dal codice chiamante vengono convertite per corrispondere alla firma del metodo prima che venga chiamato il metodo effettivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top