Вот маленький один я использую каждый день:
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;
};
Это определение варианта автоматизации OLE тип данных. Как вы видите, у него много возможных типов. Существует множество правил вокруг типов, которые вы можете использовать в разных ситуациях, в зависимости от возможностей вашего предполагаемого кода клиента. Не все типы поддерживаются всеми языками.
Типы с VT_BYREF
после них используются такими языками, как VBScript, которые по умолчанию передают параметры по ссылке. Это означает, что если у вас есть код, который заботится о деталях структуры вариантов (например, C++), вызываемых кодом, который не работает (например, VB), тогда вам необходимо тщательно разыграть параметр варианта, если это необходимо.
Типы byref также используются для возврата значений из функций. Существует также поддержка типов массивов с использованием странно неверно названного типа SAFEARRAY
- так сложно использовать из C++.
Если у вас есть массив строк, вы можете передать его в vbscript, но его нельзя использовать (кроме того, чтобы печатать размер). Чтобы действительно прочитать значения, данные массива должны быть типа VT_BYREF | VT_BSTR
.
Я предполагаю это может быть полезно! – claf
Обратите внимание, что C11 предоставляет анонимные объединения, поэтому параграф «поскольку это C» применяется к C90 и C99, но не к C11.Точно так же, поскольку этот ответ был написан в 2009 году, было вполне разумно не прогнозировать, что даст C11. –
@unwind из любопытства, я задаю этот вопрос. Вызывает ли указанная выше функция _redeclaration error_? –