Тип варианта (COM) - Variant type (COM)

Вариант - это тип данных в некоторых языках программирования, особенно в Visual Basic , OCaml , Delphi и C ++ при использовании модели компонентных объектов . Это реализация одноименной концепции в области компьютерных наук .

В Visual Basic (и Visual Basic для приложений ) тип данных Variant представляет собой помеченное объединение, которое может использоваться для представления любого другого типа данных (например, целого числа , с плавающей запятой , одинарной и двойной точности, объекта и т. Д.) кроме строкового типа фиксированной длины. В Visual Basic любая переменная, не объявленная явно или тип которой не объявлен явно, рассматривается как вариант.

Хотя использование явно не объявленных вариантов не рекомендуется, они могут быть полезны, когда необходимый тип данных может быть известен только во время выполнения, когда ожидается, что тип данных будет изменяться, или когда желательны дополнительные параметры и массивы параметров. Фактически, языки с системой динамических типов часто имеют вариант как единственный доступный тип для переменных.

Среди основных изменений в Visual Basic .NET , поскольку это язык .NET, вариантный тип был заменен на объектный тип .NET . Есть общие черты в концепции, но также и существенные различия, и между этими двумя типами нет прямых преобразований. Для преобразований, которые могут потребоваться, если код Visual Basic .NET взаимодействует с COM-объектом Visual Basic 6, обычной методологией является использование маршалинга .NET .

Примеры

В Visual Basic вариант с именем A может быть объявлен явно или неявно:

Dim A
Dim A as Variant

В Delphi вариант с именем A объявляется следующим образом:

var A: variant;

Формат

Переменная типа вариант, для краткости называемая «вариантом», как определено в Visual Basic, требует хранения 16 байтов, и ее структура выглядит следующим образом:

Компенсировать Размер Описание
0 2 Значение, возвращаемое VarType; указывает, какие данные содержит вариант.
2 6 Зарезервированные байты; должен быть установлен на ноль.
8 до 8 Данные, содержащиеся в варианте.

Типы

Ниже приведены несколько примеров вариантов, которые можно встретить в Visual Basic. На других языках также могут использоваться другие варианты.

VarType Шестигранник Тип пропварианта Пропвариантный член TypeName Байты данных Тип C и C ++
0 0x00 VT_EMPTY Никто Пустой 1
1 0x01 VT_NULL Никто Null 2
2 0x02 VT_I2 iVal Целое число 2A00 КОРОТКАЯ
3 0x03 VT_I4 lVal Длинный 2A000000 ДЛИННЫЙ
4 0x04 VT_R4 fltVal Одинокий 00002842 ПЛАВАТЬ
5 0x05 VT_R8 dblVal Двойной 0000000000004540 ДВОЙНОЙ
6 0x06 VT_CY cyVal Валюта A068060000000000 Структура CY
7 0x07 VT_DATE Дата Дата 00000000C0D5E140 ДАТА (двойная)
8 0x08 VT_BSTR bstrVal Нить xxxxxxxx (BSTR) :( OLECHAR *) :( WCHAR *) :( wchar_t *)
9 0x09 VT_DISPATCH pdispVal
10 0x0a VT_ERROR скод Ошибка 2A000A80 HRESULT (длинное целое)
11 0x0b VT_BOOL boolVal Логический FFFF VARIANT_BOOL (короткий)
12 0x0c VT_VARIANT pvarVal Вариант ВАРИАНТ
13 0x0d VT_UNKNOWN punkVal Ничего 4 00000000 IНеизвестно *
14 0x0e VT_DECIMAL decVal ДЕСЯТИЧНЫЙ
16 0x10 VT_I1 cVal Байт СИМВОЛ
17 0x11 VT_UI1 bVal Байт БАЙТ (беззнаковый символ)
18 0x12 VT_UI2 uiVal СЛОВО (беззнаковое короткое)
19 0x13 VT_UI4 ulVal DWORD (целое без знака)
20 0x14 VT_I8 hVal
21 год 0x15 VT_UI8 ухвал
22 0x16 VT_INT intVal
23 0x17 VT_UINT uintVal
24 0x18 VT_VOID
25 0x19 VT_HRESULT Отсутствует 3 80020004 HRESULT (длинное целое)
26 год 0x1a VT_PTR
27 0x1b VT_SAFEARRAY парить
28 год 0x1c VT_CARRAY
29 0x1d VT_USERDEFINED
30 0x1e VT_LPSTR pszVal
31 год 0x1f VT_LPWSTR pwszVal
36 0x24 VT_RECORD
37 0x25 VT_INT_PTR pintVal
38 0x26 VT_UINT_PTR PuintVal
8192 0x2000 VT_ARRAY парить
9 Ссылка на объект 5 xxxxxxxx IНеизвестно *
  • 1 Тип неинициализированного варианта.
  • 2 Тип значения NULL в базе данных, то есть не неинициализированный и не эквивалентный нулевому указателю C ++ .
  • 3 Отсутствующие аргументы - это на самом деле конкретное значение ошибки, озаглавленное «параметр не найден».
  • 4 Тип объекта установлен на пустую ссылку.
  • 5 TypeName вернет имя класса содержащегося объекта. Данные будут указателем на интерфейс , то есть указателем на указатель на таблицу виртуальных методов (которая представляет собой массив указателей на функции).

Общее использование

Коллекции

CollectionКласс в OLE Automation может хранить элементы разных типов данных. Поскольку тип данных этих элементов не может быть известен во время компиляции, методы добавления элементов и извлечения элементов из коллекции используют варианты. Если в Visual Basic используется For Eachконструкция, переменная итератора должна иметь объектный тип или вариант.

Вызов метода отправки

В OLE Automation IDispatchинтерфейс используется, когда класс объекта не может быть известен заранее. Следовательно, при вызове метода для такого объекта типы аргументов и возвращаемое значение неизвестны во время компиляции. Аргументы передаются в виде массива вариантов, и когда вызов завершается, возвращается вариант.

Необязательные параметры

В Visual Basic аргумент процедуры можно объявить необязательным, поставив перед ним Optionalключевое слово. Если аргумент опущен, Visual Basic передает специальное значение в процедуру, названную Missing в приведенной выше таблице, что указывает на отсутствие аргумента. Поскольку значение может быть либо предоставленным значением, либо специальным значением, необходимо использовать вариант.

Function GetText(Optional ByVal Index) As String
    If IsMissing(Index) Then
        GetText = Item(CurrentItem)
    Else
        GetText = Item(Index)
    End If
End Function

Точно так же ключевое слово ParamArrayможно использовать для передачи всех следующих аргументов в массиве вариантов.

Смотрите также

использованная литература

внешние ссылки