Condividi tramite


Funzione SafeArrayCreateEx (oleauto.h)

Crea e restituisce un descrittore di matrice sicuro da VARTYPE, numero di dimensioni e limiti specificati.

Sintassi

SAFEARRAY * SafeArrayCreateEx(
  [in] VARTYPE        vt,
  [in] UINT           cDims,
  [in] SAFEARRAYBOUND *rgsabound,
  [in] PVOID          pvExtra
);

Parametri

[in] vt

Tipo di base o VARTYPE di ogni elemento della matrice. Il flag FADF_RECORD può essere impostato per un tipo variant VT_RECORD, il flag di FADF_HAVEIID può essere impostato per VT_DISPATCH o VT_UNKNOWN e FADF_HAVEVARTYPE può essere impostato per tutti gli altri VARTYPEs.

[in] cDims

Numero di dimensioni nella matrice.

[in] rgsabound

Vettore di limiti (uno per ogni dimensione) da allocare per la matrice.

[in] pvExtra

informazioni sul tipo del tipo definito dall'utente, se si crea una matrice sicura di tipi definiti dall'utente. Se il parametro vt è VT_RECORD, pvExtra sarà un puntatore a un IRecordInfo che descrive il record. Se il parametro vt è VT_DISPATCH o VT_UNKNOWN, pvExtra conterrà un puntatore a un GUID che rappresenta il tipo di interfaccia passato alla matrice.

Valore restituito

Descrittore di matrice sicuro o Null se non è stato possibile creare la matrice.

Commenti

Se VARTYPE è VT_RECORD, viene chiamato SafeArraySetRecordInfo . Se VARTYPE è VT_DISPATCH o VT_UNKNOWN, gli elementi della matrice devono contenere interfacce dello stesso tipo. Parte del processo di marshalling di questa matrice ad altri processi include la generazione del codice proxy/stub dell'IID a cui punta il parametro pvExtra . Per passare effettivamente interfacce eterogenee, è necessario specificare IID_IUnknown o IID_IDispatch in pvExtra e fornire altri mezzi per il chiamante per identificare come eseguire una query per l'interfaccia effettiva.

Esempio

Nell'esempio seguente viene descritto come viene archiviata una matrice sicura di tipi definiti dall'utente in una variante di tipo VT_RECORD.

SAFEARRAYBOUND * sab;
sab.cElements = 2;
sab.lLbound = 0;
hresult hr;

SAFEARRAY Sa;
Sa = SafeArrayCreateEx(VT_RECORD, 1, &sab, pRecInfo);
if (Sa == NULL)
   return E_OUTOFMEMORY;

PVOID pvData;
hr = SafeArrayAccessData(Sa, &pvData);
if (FAILED(hr)) {
   SafeArrayDestroy(Sa);
   return hr;
}

TEST * pTest;
pTest = (TEST *)pvData;
pTest[0] = a;
pTest[1] = b;
hr = SafeArrayUnaccessData(Sa);
if (FAILED(hr)) {
   SafeArrayDestroy(Sa);
   return hr;
}

VariantInit(&variant);
V_VT(&variant) = VT_ARRAY|VT_RECORD;
V_ARRAY(&variant) = Sa;

Requisiti

Requisito Valore
Piattaforma di destinazione Windows
Intestazione oleauto.h
Libreria OleAut32.lib
DLL OleAut32.dll