Ecco un piccolo quello che uso tutti i giorni:
struct tagVARIANT {
union {
struct __tagVARIANT {
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union {
LONG lVal; /* VT_I4 */
BYTE bVal; /* VT_UI1 */
SHORT iVal; /* VT_I2 */
FLOAT fltVal; /* VT_R4 */
DOUBLE dblVal; /* VT_R8 */
VARIANT_BOOL boolVal; /* VT_BOOL */
_VARIANT_BOOL bool; /* (obsolete) */
SCODE scode; /* VT_ERROR */
CY cyVal; /* VT_CY */
DATE date; /* VT_DATE */
BSTR bstrVal; /* VT_BSTR */
IUnknown * punkVal; /* VT_UNKNOWN */
IDispatch * pdispVal; /* VT_DISPATCH */
SAFEARRAY * parray; /* VT_ARRAY */
BYTE * pbVal; /* VT_BYREF|VT_UI1 */
SHORT * piVal; /* VT_BYREF|VT_I2 */
LONG * plVal; /* VT_BYREF|VT_I4 */
FLOAT * pfltVal; /* VT_BYREF|VT_R4 */
DOUBLE * pdblVal; /* VT_BYREF|VT_R8 */
VARIANT_BOOL *pboolVal; /* VT_BYREF|VT_BOOL */
SCODE * pscode; /* VT_BYREF|VT_ERROR */
CY * pcyVal; /* VT_BYREF|VT_CY */
DATE * pdate; /* VT_BYREF|VT_DATE */
BSTR * pbstrVal; /* VT_BYREF|VT_BSTR */
IUnknown ** ppunkVal; /* VT_BYREF|VT_UNKNOWN */
IDispatch ** ppdispVal; /* VT_BYREF|VT_DISPATCH */
SAFEARRAY ** pparray; /* VT_BYREF|VT_ARRAY */
VARIANT * pvarVal; /* VT_BYREF|VT_VARIANT */
PVOID byref; /* Generic ByRef */
CHAR cVal; /* VT_I1 */
USHORT uiVal; /* VT_UI2 */
ULONG ulVal; /* VT_UI4 */
INT intVal; /* VT_INT */
UINT uintVal; /* VT_UINT */
DECIMAL * pdecVal; /* VT_BYREF|VT_DECIMAL */
CHAR * pcVal; /* VT_BYREF|VT_I1 */
USHORT * puiVal; /* VT_BYREF|VT_UI2 */
ULONG * pulVal; /* VT_BYREF|VT_UI4 */
INT * pintVal; /* VT_BYREF|VT_INT */
UINT * puintVal; /* VT_BYREF|VT_UINT */
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
};
Questa è la definizione della variante di automazione OLE tipo di dati. Come puoi vedere, ha molti tipi possibili. Esistono molte regole sui tipi che è possibile utilizzare in diverse situazioni, a seconda delle funzionalità del codice client desiderato. Non tutti i tipi sono supportati da tutte le lingue.
I tipi con VT_BYREF
dopo di loro sono utilizzati da lingue come VBScript che passano parametri per riferimento predefinita. Ciò significa che se si dispone di un codice che si preoccupa dei dettagli della struttura della variante (come C++) che vengono chiamati dal codice che non lo fa (come VB), allora è necessario devolvere con attenzione il parametro variant, se necessario.
I tipi di byte vengono anche utilizzati per restituire valori dalle funzioni. C'è anche il supporto per i tipi di matrice utilizzando la stranamente misnamed SAFEARRAY
tipo - così difficile da usare da C++.
Se si dispone di un array di stringhe, è possibile passarlo a vbscript, ma non può essere utilizzato (tranne che per stampare le dimensioni). Per leggere effettivamente i valori, i dati dell'array devono essere di tipo VT_BYREF | VT_BSTR
.
fonte
2009-04-07 08:19:11
Immagino questo potrebbe essere utile! – claf
Nota che C11 fornisce unioni anonime, quindi il paragrafo "poiché questo è C" si applica a C90 e C99, ma non a C11.Altrettanto chiaramente, dal momento che questa risposta è stata scritta nel 2009, era del tutto ragionevole non prevedere cosa avrebbe fornito C11. –
@unwind per curiosità, sto facendo questa domanda. La funzione sopra non fornisce _redeclaration error_? –