Hier ist ein kleiner, den ich jeden Tag benutzen:
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;
};
Dies ist die Definition der OLE-Automation-Variante Datentyp. Wie Sie sehen können, hat es viele mögliche Typen. Es gibt viele Regeln für die Typen, die Sie in verschiedenen Situationen verwenden können, abhängig von den Funktionen Ihres beabsichtigten Client-Codes. Nicht alle Typen werden von allen Sprachen unterstützt.
Die Typen mit VT_BYREF
nach ihnen werden von Sprachen wie VBScript verwendet, die Parameter standardmäßig per Referenz übergeben. Das bedeutet, wenn Sie Code haben, der sich um die Details der Variantenstruktur kümmert (z. B. C++), die von Code aufgerufen werden, der dies nicht tut (z. B. VB), müssen Sie den Variantenparameter bei Bedarf sorgfältig dereferenzieren.
Die byref-Typen werden auch verwendet, um Werte aus Funktionen zurückzugeben. Es gibt auch Unterstützung für Array-Typen, die den seltsamen Typ SAFEARRAY
verwenden - so schwierig von C++ zu verwenden.
Wenn Sie ein Array mit Zeichenfolgen haben, können Sie es an VBScript übergeben, es kann jedoch nicht verwendet werden (außer zum Drucken der Größe). Um die Werte tatsächlich zu lesen, müssen die Array-Daten vom Typ VT_BYREF | VT_BSTR
sein.
Ich denke dieser könnte nützlich sein! – claf
Beachten Sie, dass C11 anonyme Verbindungen bietet. Daher gilt der Absatz "da dies C ist" für C90 und C99, nicht jedoch für C11.Ebenso klar, da diese Antwort im Jahr 2009 verfasst wurde, war es ziemlich vernünftig, nicht vorauszusagen, was C11 bieten würde. –
@unwind aus Neugier, ich frage diese Frage. Bietet die obige Funktion keinen _redeclaration error_? –