Вы можете передавать аргументы в качестве параметров когда вызываете из Visual FoxPro элемент управления ActiveX, COM-объект или динамически подключаемую библиотеку Visual FoxPro (FLL). Например, элемент управления ActiveX может принять аргументы при вызове одного из его методов. По аналогии, программа Visual FoxPro может вызвать функцию в своей библиотеке FLL и передать ей аргументы.
Visual FoxPro может передавать аргументы через параметры внешней библиотеки по значению и по ссылке. По умолчанию считается заданной команда SET UDFPARMS. Однако, некоторые переменные, такие как массивы, поля и выражения, передаются по значению. Более подробно о том, как изменить умалчиваемое значение для передачи аргументов, можно узнать в Passing Data to Parameters (Передача Данных через Параметры).
Ввиду того, что элементы управления ActiveX и COM объекты являются стандартными программами Windows, нет специальных механизмов по передаче в их параметры аргументов из программ Visual FoxPro. Код передачи аргументов библиотеке FLL можно писать так, как будто аргументы передаются из программ, написанных на языках C или C++.
Однако, функции библиотеки FLL используют FoxInfo структуру для
получения аргументов из Visual FoxPro. FoxInfo
структура включает в себя список функций библиотеки, количество и тип
параметров, которые ожидает получить. Например, следующая FoxInfo
структура принадлежит библиотеке с одной функцией, имеющей внутреннее
имя dates
, которая получает один Character параметр:
В | ![]() |
---|---|
FoxInfo myFoxInfo[] = { |
Функции, которые вы определяете во внешней библиотеке в
действительности получают только один параметр - указатель на блок
параметров. Блок параметров, определенный в структуре ParamBlk
, хранит всю информацию о параметрах, которые были переданы из функции вызова Visual
FoxPro. Следующий код иллюстрирует формат, которому должна следовать ваша декларируемая функция:
В | ![]() |
---|---|
void function_name(ParamBlk *parm) |
Например, определение функции dates
выглядит так:
В | ![]() |
---|---|
void dates(ParamBlk *parm) |
Структура ParamBlk
состоит из целого, которое представляет собой
количество параметров, со следующим за ним массивом
объединенного параметра. Определение структуры включено в Pro_ext.h:
В | ![]() |
---|---|
/* Список параметров для библиотечной функции */ |
Тип Parameter
, включенный в структуру ParamBlk
,
является объединением структуры Value и структуры Locator.
Вызов по значению оперирует со структурой Value, а вызов по ссылке
- со структурой Locator. Эту структура предназначена для доступа к
параметрам, переданным вашей функции при ее вызове из Visual FoxPro.
Следующая информация, выделенная из файла Pro_ext.h, показывает определение типа Parameter
:
В | ![]() |
---|---|
/* Параметр для библиотечной функции */ |
Определение Структуры Value
Если параметр передан в вашу функцию по значению, то для доступа к нему используйте структуру Value. Следующая структура Value
выделена из файла Pro_ext.h:
В | ![]() |
---|---|
// Значение выражения. |
Value Structure Fields
Следующая таблица является справочником по значениям, которые Вы можете передать и получить в структуре Value для различных типов данных. Только указанные поля структуры могут быть использованы для этого типа данных.
Тип данных | Поле структуры | Значение |
---|---|---|
Character |
|
'C' |
|
|
длина строки |
|
|
MHANDLE для строки |
Numeric |
|
'N' |
|
|
Ширина отображения |
|
|
Десятичные разряды |
|
|
Двойная точность |
Integer |
|
'I' |
|
|
Высота отображения |
|
|
Длинное целое |
Date |
|
'D' |
|
|
Дата1 |
Date Time |
|
'T' |
|
|
Дата + (секунды/86400.0) |
Currency |
|
'Y' |
|
|
Ширина отображения |
|
|
Денежное значение2 |
Logical |
|
'L' |
|
|
0 or 1 |
Memo |
|
'M' |
|
|
FCHAN |
|
|
Длина memo-поля |
|
|
Смещение memo-поля |
General |
|
'G' |
|
|
FCHAN |
|
|
Длина поля general |
|
|
Смещение поля general |
Object |
|
'O' |
|
идентификатор объекта |
|
Null |
|
'0' (zero) |
|
Тип данных |
1. Дата представлена как номер
дня в Юлианском календаре с двойной точностью и с плавающей точкой, вычисленный с использованием Алгоритма 199
из Коллекции Алгоритмов ACM.
2. Денежное значение - это длинное целое с неявной десятичной точкой перед последними четырьмя цифрами.
![]() |
---|
|
Определение Структуры Locator
Используйте структуру Locator для манипулирования параметрами переданными по ссылке. Следующая структура Locator
выделена из файла Pro_ext.h:
В | ![]() |
---|---|
typedef struct { |
Locator Structure Fields
Следующая таблица является справочником по полям структуры Locator.
Поле Locator'а | Применение поля |
---|---|
|
|
|
Номер таблицы, содержащей это поле или -1 для переменной. |
|
Имя Табличного Индекса. Для внутреннего применения Visual FoxPro. |
|
Номер поля в таблице. Для внутреннего применения Visual FoxPro. |
|
Только для переменных - число индексов (0 - 2). |
|
Только для переменных - первый индекс, если |
|
Только для переменных - первый индекс, если |
![]() |
---|
Хорошей манерой при программировании является проверка типа параметра в ev_type для того, чтобы определять какие поля доступны из структуры Value. |
Пример Организации Доступа к Параметрам в Библиотеке FLL
В следующем примере _StrCpy( )
используется для
возврата в Visual FoxPro типа Character, который является
конкатенацией двух Character параметров. Обратите внимание на то,
что хотя описатель каждого параметра структуры Value использован как
рабочая память для выполнения конкатенации, изменения в распределении
этой памяти не влияют на аргумент Visual FoxPro, который был передан по
значению.
(The following example uses _StrCpy( )
to return a
Character type to Visual FoxPro that's the concatenation of its two
Character parameters. Notice that although the handle of each
parameter's Value structure is used as working memory to perform the
concatenation, changes to this memory allocation don't affect the
Visual FoxPro argument that was passed by value.)
![]() |
|
---|---|
#include <Pro_ext.h> |
См. также
Задачи
Руководство: Добавление API Вызовов в Visual FoxProРуководство: Возврат Значений из Элементов Управления ActiveX и FLL Библиотек
Ссылка
Передача параметров в Visual FoxPro API ФункцииOther Resources
Подключение Visual FoxPro APIРасширение Visual FoxPro Внешними Библиотеками
Построение API Библиотеки