OleExSup.dll

OleExSup.dll

OleExSup - внешняя компонента расширяющая штатные возможности обращения к OLE-объектам. В настоящее время это касается передачи массивов SAFEARRAY, в качестве параметров и возвращаемого значения, при вызове метода объекта через интерфейс IDispatch.

В компоненте, соответственно, реализован достаточно функциональный класс OleSafeArray.

Примечание

OleExSup.dll не требует регистрации в реестре.

OleExSup.dll написана для личного пользования, не является законченным продуктом и находится в процессе изменений. Вы можете использовать OleExSup.dll на свой страх и риск.

В проекте использован каркас реализации внешних компонент от Александра Орефкова (orefkov).

Вместо эпиграфа

Иногда возникает необходимость передать массив в некоторый OLE-объект или получить массив из него.

Пример с использованием MSScriptControl.ScriptControl:

//Создание скрипта и получение объекта
ScrCtrl = СоздатьОбъект("ScriptControl");
ScrCtrl.Language="VBScript";
ScrCtrl.AddCode("
|Function Method1()
|  Method1 = Array(1.2345, ""_Строка_"", Date)
|End Function
|
|Function Method2(Arr)
|  For Each Item In Arr
|    MsgBox Item
|  Next
|End Function
|");
CodeObject = ScrCtrl.Modules("Global").CodeObject;

//Вызов метода объекта
Массив = CodeObject.Method1();

При попытке выполнить такой код, получим исключение на последней строке с описанием ошибки: "Тип переменой не поддерживается". Оно и понятно - v7.7 не умеет хранить в своих переменных массивы типа SAFEARRAY (в отличии, кстати, от v8.x)

Вывод: нужно во-первых реализовать объект-контейнер массива. Во-вторых реализовать возможность вызова методов IDispatch умеющую обращаться с этим контейнером.

  • Класс OleSafeArray
  • Класс OLEExSup

Что получили

Изменив вызов метода объекта в примере, получаем, изменяем и предаем массив.

//Вызов метода объекта
OLEExSup = СоздатьОбъект("OLEExSup");
Массив = OLEExSup.InvokeOLEMethod(CodeObject, "Method1"); //получаем массив

//Изменяем массив
Для Инд = Массив.GetLBound() По Массив.GetUBound() Цикл
        Значение = Массив.GetValue(Инд);
        Сообщить(Значение);
        Массив.SetValue(Инд, Значение+1);
КонецЦикла;

//Передаем массив в метод объекта
OLEExSup.InvokeOLEMethod(CodeObject, "Method2", Массив);
  • История версий
  • Дополнительные материалы
©2009 Трапезников Дмитрий (trad)


Класс OleSafeArray

OleExSup.dll | Ранее: OleExSup.dll | Далее: ТипыЗначений / VarTypes
Класс OleSafeArray

Класс-обертка массива SAFEARRAY. Позволяет создавать и использовать SAFEARRAY для обмена данными между OLE-объектами.

Свойства

ТипыЗначений / VarTypes Фиксированная коллекция допустимых типов значений массива.

Методы

Создать / Create | Создает массив с указанным типом значений и заданной размерностью каждого измерения.
ПолучитьТип / GetType | Возвращает тип значений массива.
КоличествоИзмерений / GetDim | Возвращает количество измерений массива.
НижняяГраница / GetLBound | Возвращает нижнюю границу индекса по измерению массива.
ВерхняяГраница / GetUBound | Возвращает верхнюю границу индекса по измерению массива.
ПолучитьЗначение / GetValue | Возвращает значение по указанным индексам.
УстановитьЗначение / SetValue | Устанавливает значение по указанным индексам.


Класс OleSafeArray::ТипыЗначений / VarTypes

OleExSup.dll | Ранее: Класс OleSafeArray | Далее: Создать / Create
Класс OleSafeArray :: ТипыЗначений / VarTypes

Доступ: только чтение.

Описание: Фиксированная коллекция допустимых типов значений массива.

Коллекция имеет следующие элементы:

  • VT_EMPTY = 0
  • VT_I1 = 16
  • VT_I2 = 2
  • VT_I4 = 3
  • VT_INT = 22
  • VT_UI1 = 17
  • VT_UI2 = 18
  • VT_UI4 = 19
  • VT_UINT = 23
  • VT_R4 = 4
  • VT_R8 = 5
  • VT_DECIMAL = 14
  • VT_CY = 6
  • VT_DATE = 7
  • VT_BSTR = 8
  • VT_DISPATCH = 9
  • VT_ERROR = 10
  • VT_BOOL = 11
  • VT_VARIANT = 12


Класс OleSafeArray::Создать / Create

OleExSup.dll | Ранее: ТипыЗначений / VarTypes | Далее: ПолучитьТип / GetType
Класс OleSafeArray :: Создать / Create

Синтаксис:

  • Создать(ТипЗначений, Разм1[, ..., РазмN])
  • Создать(ТипЗначений, СписокЗначений)
  • Создать(ТипЗначений, ТаблицаЗначений)
  • Создать(ТипЗначений, OleSafeArray)
:

Параметры:

  • ТипЗначений - тип: Число, значение элемента из коллекции OleSafeArray::ТипыЗначений
  • Разм1[, ..., РазмN] - тип: Число, значения размерности измерений
  • СписокЗначений - список значений с размерностями измерений. Размер списка соответствует количеству измерений
  • ТаблицаЗначений - таблица значений с размерностями измерений. Количество колонок - 1. Количество строк соответствует количеству измерений
  • OleSafeArray - одномерный массив с размерностями измерений создаваемого массива. Количество элементов передаваемого массива соответствует количеству измерений создаваемого массива

Описание: Создает массив с указанным типом значений и заданной размерностью каждого измерения.

Примечание: Допустимы любые типы значений кроме VT_EMPTY. Количество измерений равно количеству переданных параметров Разм1[, ..., РазмN], либо количеству элементов в СписокЗначений, ТаблицаЗначений либо OleSafeArray. Минимальное количество измерений равно 1. Нижняя граница индекса каждого измерения равна 0. Верхняя граница индекса каждого измерения равна Разм-1.


Класс OleSafeArray::ПолучитьТип / GetType

OleExSup.dll | Ранее: Создать / Create | Далее: КоличествоИзмерений / GetDim
Класс OleSafeArray :: ПолучитьТип / GetType

Синтаксис: ПолучитьТип()

Возвращает: тип: Число, значение элемента из коллекции OleSafeArray::ТипыЗначений

Описание: Возвращает тип значений массива.


Класс OleSafeArray::КоличествоИзмерений / GetDim

OleExSup.dll | Ранее: ПолучитьТип / GetType | Далее: НижняяГраница / GetLBound
Класс OleSafeArray :: КоличествоИзмерений / GetDim

Синтаксис: КоличествоИзмерений()

Возвращает: тип: Число, количество измерений массива

Описание: Возвращает количество измерений массива.


Класс OleSafeArray::НижняяГраница / GetLBound

OleExSup.dll | Ранее: КоличествоИзмерений / GetDim | Далее: ВерхняяГраница / GetUBound
Класс OleSafeArray :: НижняяГраница / GetLBound

Синтаксис: НижняяГраница([Измерение])

Параметр: Измерение - тип: Число, номер измерения. Необязательный. Если не указано, то 1

Возвращает: тип: Число, нижняя граница индекса

Описание: Возвращает нижнюю границу индекса по измерению массива.


Класс OleSafeArray::ВерхняяГраница / GetUBound

OleExSup.dll | Ранее: НижняяГраница / GetLBound | Далее: ПолучитьЗначение / GetValue
Класс OleSafeArray :: ВерхняяГраница / GetUBound

Синтаксис: ВерхняяГраница([Измерение])

Параметр: Измерение - тип: Число, номер измерения. Необязательный. Если не указано, то 1

Возвращает: тип: Число, верхняя граница индекса

Описание: Возвращает верхнюю границу индекса по измерению массива.


Класс OleSafeArray::ПолучитьЗначение / GetValue

OleExSup.dll | Ранее: ВерхняяГраница / GetUBound | Далее: УстановитьЗначение / SetValue
Класс OleSafeArray :: ПолучитьЗначение / GetValue

Синтаксис:

  • ПолучитьЗначение(Индекс1[, ..., ИндексN])
  • ПолучитьЗначение(СписокЗначений)
  • ПолучитьЗначение(ТаблицаЗначений)
  • ПолучитьЗначение(OleSafeArray)
:

Параметры:

  • Индекс1[, ..., ИндексN] - тип: Число. Значения индексов по каждому измерению массива
  • СписокЗначений - список значений с индексами. Размер списка должен соответствовать количеству измерений
  • ТаблицаЗначений таблица значений с индексами. Количество колонок - 1. Количество строк должно соответствовать количеству измерений
  • OleSafeArray - одномерный массив с индексами. Размер передаваемого массива должен соответствовать количеству измерений принимающего массива

Возвращает: тип: Любой, значение элемента массива

Описание: Возвращает значение по указанным индексам.


Класс OleSafeArray::УстановитьЗначение / SetValue

OleExSup.dll | Ранее: ПолучитьЗначение / GetValue | Далее: Класс OLEExSup
Класс OleSafeArray :: УстановитьЗначение / SetValue

Синтаксис:

  • УстановитьЗначение(Индекс1[, ..., ИндексN], Значение)
  • УстановитьЗначение(СписокЗначений, Значение)
  • УстановитьЗначение(ТаблицаЗначений, Значение)
  • УстановитьЗначение(OleSafeArray, Значение)
:

Параметры:

  • Индекс1[, ..., ИндексN] - тип: Число. Значения индексов по каждому измерению массива
  • СписокЗначений - список значений с индексами. Размер списка должен соответствовать количеству измерений
  • ТаблицаЗначений таблица значений с индексами. Количество колонок - 1. Количество строк должно соответствовать количеству измерений
  • OleSafeArray - одномерный массив с индексами. Размер передаваемого массива должен соответствовать количеству измерений принимающего массива
  • Значение - тип: Любой, значение элемента массива

Описание: Устанавливает значение по указанным индексам.

Примечание: Значение приводится к типу значений массива.


Класс OLEExSup

OleExSup.dll | Ранее: УстановитьЗначение / SetValue | Далее: ТипыЗначений / VarTypes
Класс OLEExSup

Вспомогательный класс для работы с OLE-объектами

Свойства

ТипыЗначений / VarTypes См. описание одноименного свойства OleSafeArray OleSafeArray::ТипыЗначений

Методы

ВызватьОЛЕМетод / InvokeOLEMethod | Выполняет вызов метода через интерфейс IDispatch.
ПолучитьСвойство / GetProperty | Выполняет получение значения свойства через интерфейс IDispatch.
УстановитьСвойство / PutProperty | Выполняет установку значения свойства через интерфейс IDispatch.


Класс OLEExSup::ТипыЗначений / VarTypes

OleExSup.dll | Ранее: Класс OLEExSup | Далее: ВызватьОЛЕМетод / InvokeOLEMethod
Класс OLEExSup :: ТипыЗначений / VarTypes

Доступ: только чтение.

Описание: См. описание одноименного свойства OleSafeArray OleSafeArray::ТипыЗначений


Класс OLEExSup::ВызватьОЛЕМетод / InvokeOLEMethod

OleExSup.dll | Ранее: ТипыЗначений / VarTypes | Далее: ПолучитьСвойство / GetProperty
Класс OLEExSup :: ВызватьОЛЕМетод / InvokeOLEMethod

Синтаксис: ВызватьОЛЕМетод(ОЛЕОбъект, Метод, [Параметр1[, ..., ПараметрN]])

Параметры:

  • ОЛЕОбъект - объект реализующий интерфейс IDispatch
  • Метод - тип: Строка, название метода ОЛЕ-объекта
  • [Параметр1[, ..., ПараметрN]] - тип: Любой, параметры метода объекта

Возвращает: тип: Любой, результат возвращаемый матодом ОЛЕ-объекта

Описание: Выполняет вызов метода через интерфейс IDispatch.

Примечание: Если среди параметров - есть объект типа OleSafeArray параметр преобразуется в указатель на SAFEARRAY. Если возвращаемое значение - есть SAFEARRAY то возвращается OleSafeArray


Класс OLEExSup::ПолучитьСвойство / GetProperty

OleExSup.dll | Ранее: ВызватьОЛЕМетод / InvokeOLEMethod | Далее: УстановитьСвойство / PutProperty
Класс OLEExSup :: ПолучитьСвойство / GetProperty

Синтаксис: ПолучитьСвойство(ОЛЕОбъект, Свойство)

Параметры:

  • ОЛЕОбъект - объект реализующий интерфейс IDispatch
  • Свойство - тип: Строка, название свойства ОЛЕ-объекта

Возвращает: тип: Любой, значение свойства ОЛЕ-объекта

Описание: Выполняет получение значения свойства через интерфейс IDispatch.

Примечание: Если значение - есть SAFEARRAY то возвращается OleSafeArray


Класс OLEExSup::УстановитьСвойство / PutProperty

OleExSup.dll | Ранее: ПолучитьСвойство / GetProperty | Далее: История версий
Класс OLEExSup :: УстановитьСвойство / PutProperty

Синтаксис: УстановитьСвойство(ОЛЕОбъект, Свойство, Значение)

Параметры:

  • ОЛЕОбъект - объект реализующий интерфейс IDispatch
  • Свойство - тип: Строка, название свойства ОЛЕ-объекта
  • Значение - тип: Любой, значение свойства объекта

Описание: Выполняет установку значения свойства через интерфейс IDispatch.

Примечание: Если устанавливаемое значение - есть объект типа OleSafeArray параметр преобразуется в указатель на SAFEARRAY.


История версий

OleExSup.dll | Ранее: УстановитьСвойство / PutProperty | Далее: Дополнительные материалы
История версий

1.0.0.7

  • Доработано преобразование типов при получении значений свойств и возвращаемых результатов

1.0.0.6

  • Добавлены методы OLEExSup :: ПолучитьСвойство, УстановитьСвойство

1.0.0.5

  • Устранена утечка памяти при работе с созданным массивом
  • Уточнен список поддерживаемых типов массива
  • Добавлены русскоязычные синонимы методов и свойств
  • Добавлена документация chm

0.0.0.3 (beta)

  • Расширен синтаксис методов OleSafeArray :: Создать, УстановитьЗначение, ПолучитьЗначение

0.0.0.2 (beta)

  • Первая публичная бета-версия


Дополнительные материалы

OleExSup.dll | Ранее: История версий | Далее: Вывод двумерного массива
Дополнительные материалы
  • Вывод двумерного массива
  • Обход N-мерного массива (рекурсивный)
  • Ссылки по теме


Вывод двумерного массива

OleExSup.dll | Ранее: Дополнительные материалы | Далее: Обход N-мерного массива (рекурсивный)
Вывод двумерного массива
Для Инд1=Массив.GetLBound(1) По Массив.GetUBound(1) Цикл
        Для Инд2=Массив.GetLBound(2) По Массив.GetUBound(2) Цикл
                Сообщить(Массив.GetValue(Инд1,Инд2));
        КонецЦикла;
КонецЦикла;


Обход N-мерного массива (рекурсивный)

OleExSup.dll | Ранее: Вывод двумерного массива | Далее: Ссылки по теме
Обход N-мерного массива (рекурсивный)

Три варианта отличающихся лишь способом передачи индексов.

Процедура ОбойтиМассив1(Массив, Измерение=1, Индексы="")
        Если Измерение = 1 Тогда
                Индексы = СоздатьОбъект("СписокЗначений");
        КонецЕсли;
        Если Индексы.РазмерСписка()<Измерение Тогда
                Индексы.ДобавитьЗначение("");
        КонецЕсли;
        Для Инд = Массив.GetLBound(Измерение) По Массив.GetUBound(Измерение) Цикл
                Индексы.УстановитьЗначение(Измерение, Инд);
                Если Измерение < Массив.GetDim() Тогда
                        ОбойтиМассив1(Массив, Измерение+1, Индексы);
                Иначе
                        Значение = Массив.GetValue(Индексы);
                        Сообщить(ТипЗначенияСтр(Значение)+" "+Значение);
                КонецЕсли;
        КонецЦикла;
КонецПроцедуры

Процедура ОбойтиМассив2(Массив, Измерение=1, Индексы="")
        Если Измерение = 1 Тогда
                Индексы = СоздатьОбъект("ТаблицаЗначений");
                Индексы.КоличествоКолонок(1);
                Индексы.КоличествоСтрок(Массив.GetDim());
        КонецЕсли;
        Для Инд = Массив.GetLBound(Измерение) По Массив.GetUBound(Измерение) Цикл
                Индексы.УстановитьЗначение(Измерение, 1, Инд);
                Если Измерение < Массив.GetDim() Тогда
                        ОбойтиМассив2(Массив, Измерение+1, Индексы);
                Иначе
                        Значение = Массив.GetValue(Индексы);
                        Сообщить(ТипЗначенияСтр(Значение)+" "+Значение);
                КонецЕсли;
        КонецЦикла;
КонецПроцедуры

Процедура ОбойтиМассив3(Массив, Измерение=1, Индексы="")
        Если Измерение = 1 Тогда
                Индексы = СоздатьОбъект("OLESafeArray");
                Индексы.Create(Индексы.VarTypes.VT_I2, Массив.GetDim());
        КонецЕсли;
        Для Инд = Массив.GetLBound(Измерение) По Массив.GetUBound(Измерение) Цикл
                Индексы.SetValue(Измерение-1, Инд);
                Если Измерение < Массив.GetDim() Тогда
                        ОбойтиМассив3(Массив, Измерение+1, Индексы);
                Иначе
                        Значение = Массив.GetValue(Индексы);
                        Сообщить(ТипЗначенияСтр(Значение)+" "+Значение);
                КонецЕсли;
        КонецЦикла;
КонецПроцедуры

ОбойтиМассив1(Массив);
ОбойтиМассив2(Массив);
ОбойтиМассив3(Массив);


Ссылки по теме

OleExSup.dll | Ранее: Обход N-мерного массива (рекурсивный) | Далее:
Ссылки по теме
  • Обсуждение на форуме 1cpp.ru
  • В каталоге на Инфостарт