Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

12. Конструктор модулей для объектов ActiveX

len = ConvertBSTRToString(bstr, string2)

print *, string2 ! Test string end program BSTR_example

12.5.3. Варианты

Производный тип данных variant определен в файле dfwinty.f90:

type variant sequence integer(2) vt

integer(2) reserved1, reserved2, reserved3 record /variant_union/ vu

end type variant

Структура variant_union, использованная при формировании типа variant, имеет вид:

structure /variant_union/

! Взята из файла dfwinty.f90

union

 

map

 

integer(4) long_val

! VT_I4

end map

 

map

 

character char_val

! VT_UI1

end map

 

map

 

integer(2) short_val

! VT_I2

end map

 

map

 

real(4) float_val

! VT_R4

end map

 

map

 

real(8) double_val

! VT_R8

end map

 

map

 

integer(2) bool_val

! VT_BOOL

end map

 

map

 

integer(4) scode_val

! VT_ERROR

end map

 

map

 

real(8) date_val

! VT_DATE

end map

! ptr_val - целочисленный указатель

map

integer(4) ptr_val

! Для параметров, передаваемых по ссылке

end map

 

end union

 

end structure

 

385

О. В. Бартеньев. Современный ФОРТРАН

Тип variant широко распространен в Автоматизации; им, в частности, обладает подавляющее большинство параметров свойств и методов Автоматизации. Переменные типов variant называются вариантами. Варианты предназначаются для хранения данных разных типов и позволяют преобразовывать один тип в другой. Возможные типы, используемые с вариантами и другими объектами Автоматизации, задаются определенными в модуле DFWINTY целочисленными константами. Перечислим некоторые из них:

integer(2), parameter :: vt_empty = 0

! Значение не задано

integer(2), parameter :: vt_null = 1

! null

integer(2), parameter :: vt_i2 = 2

! INTEGER(2)

integer(2), parameter :: vt_i4 = 3

! INTEGER(4)

integer(2), parameter :: vt_r4 = 4

! REAL(4)

integer(2), parameter :: vt_r8 = 5

! REAL(8)

! Дата - число с плавающей точкой двойной точности

integer(2), parameter :: vt_date = 7

 

integer(2), parameter :: vt_bstr = 8

! BSTR

! Указатель на объект, реализующий IDispatch

integer(2), parameter :: vt_dispatch = 9

 

integer(2), parameter :: vt_error = 10

! Код ошибки

integer(2), parameter :: vt_bool = 11

! Истина (#FFFF) или ложь (#0000)

integer(2), parameter :: vt_variant = 12

! Указатель на вариант

! Указатель на объект, реализующий Iunknown

integer(2), parameter :: vt_unknown = 13

 

integer(2), parameter :: vt_i1 = 16

! INTEGER(1)

integer(2), parameter :: vt_ui1 = 17

! Целое без знака длиной в 1 байт

integer(2), parameter :: vt_ui2 = 18

! Целое без знака длиной в 2 байта

integer(2), parameter :: vt_ui4 = 19

! Целое без знака длиной в 4 байта

Манипулировать вариантами позволяют приведенные в табл. 12.5 функции и подпрограмма. Тип функций - INTEGER(4).

Таблица 12.5. Процедуры для вариантов

Функция

Назначение

 

 

VariantChangeType

Преобразовывает вариант в другой тип

VariantChangeTypeEx

Преобразовывает вариант в другой тип, используя

 

идентификатор местности LCID, употребляемый при

 

работе с разноязычными приложениями

VariantClear

Очищает вариант (освобождает память, занимаемую

 

вариантом)

VariantCopy

Копирует вариант

 

 

VariantCopyInd

Копирует вариант, выполняя преобразование флага

 

VT_BYREF, обеспечивающего передачу по ссылке, в

 

BYVAL, что гарантирует передачу варианта по

386

12. Конструктор модулей для объектов ActiveX

значению

VariantInit (подпрограмма) Выполняет инициализацию варианта

VariantTimeToDosDateTime Преобразовывает время, представленное в виде варианта, в дату и время в формате MSDOS

VariantTimeToSystemTime Преобразовывает время, представленное в виде варианта, в системное представление времени

Замечание. Модуль OLEAUT32 не содержит интерфейсы функция VariantTimeToDosDateTime и VariantTimeToSystemTime.

Пример. Создаются два варианта. Первый предназначается для хранения указателя BSTR, а второй - для 4-байтового вещественного числа. Каждый вариант получает соответствующее значение: первый - указатель на BSTRстроку "Компак Фортран", второй - число 6.1. Далее второй вариант преобразовывается в тип BSTR; оба варианта переводятся в строки Фортрана и выводится результат.

program variant_example

 

use dfcomty

 

use dfcom

 

use TextTransfer

! Для вывода русского текста в DOS-окно

integer(4) :: status, length

! Код модуля TextTransfer см. в прил. 1

character(80) :: char1, char2

! Тип variant описан в файле dfwinty.f90

type(variant) v1, v2

call VariantInit(v1)

! Инициализация вариантов

call VariantInit(v2)

! Вариант v1 хранит BSTR-строку

v1%vt = VT_BSTR

!Преобразовываем строку Фортрана в строку BSTR

!Преобразовывающую функцию ConvertStringToBSTR см. в файле dfcom.f90 v1%vu%ptr_val = ConvertStringToBSTR("Компак Фортран")

v2%vt = VT_R4

! 4-байтовое вещественное число

v2%vu%float_val = 6.1

 

!Интерфейсы функций, работающих с вариантами, см. в oleaut32.f90

!Преобразовываем вариант v2 в BSTR-строку

status = VariantChangeType(v2, v2, 0, VT_BSTR)

!Преобразовываем строки BSTR в строки Фортрана

!Преобразовывающую функцию ConvertBSTRToString см. в файле dfcom.f90 length = ConvertBSTRToString(v1%vu%ptr_val, char1)

length = ConvertBSTRToString(v2%vu%ptr_val, char2)

print *, trim(RuDosWin(trim(char1) // " " // trim(char2), .false.))

status = VariantClear(v1)

! Очищаем вариант

status = VariantClear(v2)

 

end program variant_example

 

387