Когда вы регистрируете Функцию из библиотеки .DLL, вам необходимо указать количество и Типы передаваемых Параметров. По-умолчанию, параметры во внешние функции передаются "по-значению". Вы можете определить, что конкретный параметр передается "по-ссылке", для этого при регистрации внешней функции (команда Declare) вам требуется передпараметром указать специальный символ (@).

В основном, для внешних функций DLL применяется общее Соглашение по передаче типов параметров, принятая для Языка программирования "C", которая отличается от используемых традиций в системе Visual FoxPro. Например, обычно функции DLL не поддерживают такие типы данных, как Data или Currency. Если вам требуется передать в функцию DLL параметр некоторого Типа, который не поддерживается данной функцией, вам необходимо выполнить соответствующее преобразование перед передачей параметра. К примеру, параметр типа Data - преобразовать в числовой формат Julian, допустим при помощи следующих строк Программного Кода:

  CopyCode imageКопировать Код
cDate = sys(11, date())
nDate = val( cDate )

Некоторые внешние функции DLL требуют передачи более сложных параметров: Структур или Массивов. Если внешняя функция требует передачи в качестве параметра некоторый Указатель на Структуру, вы должны предварительно описать и создать указанную Структуру данных в виде символьной строки Visual FoxPro, и только после этого передавать ее указатель в Функцию, это относится также к получению из внешней функции результирующих Значений в виде Структуры. Например, известная системная (Windows) функция API GetSystemTime( ) возвращает указатель на Структуру, содержащую восемь стандартных слов (тип WORD: - 8-мь Бит) или 16-ти битных беззнаковых целых чисел (Inntger), которые содержат соответственно: Год, Месяц, День, час, и так далее - текущего Системного Времени. Далее приводится рассмотренная структура Системного Времени:

  CopyCode imageКопировать Код
typedef struct _SYSTEMTIME { 
WORD wYear ;
WORD wMonth ;
WORD wDayOfWeek ;
WORD wDay ;
WORD wHour ;
WORD wMinute ;
WORD wSecond ;
WORD wMilliseconds ;
} SYSTEMTIME

Для обмена данными между системой Visual FoxPro и внешней функцией API GetSystemTime( ), вам требуется создать символьную строку (некоторый Буфер) длиной в 40-к Байт, которая предварительно заполнена пробелами, далее адрес данной строки передается в функцию, которая заполняет соответствующим образом описанную Структуру. Когда данная строка получена, вам нужно выполнить разбор заполненных результирующих значений, как 2-х байтных двоичных Строк - соответствующих полей описанной выше Структуры Системного Времени. Обратите внимание, что длины соответствующих Полей имеют разные Значения. В следующем далее фрагменте программного кода демонстрируется разбор полученной структуры Данных Системного Времени:

  CopyCode imageКопировать Код
DECLARE INTEGER GetSystemTime IN win32api STRING @
cBuff=SPACE(40)
=GetSystemTime(@cBuff)

tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * ;
256 + ASC(SUBSTR(cBuff,1))))
tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) * ;
256 + ASC(SUBSTR(cBuff,3))))
tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) * ;
256 + ASC(SUBSTR(cBuff,5))))

Дополнительную информацию вы можете получить при рассмотрении примера: Systime.scx, расположенной в подкаталоге Visual FoxPro ...\Samples\Solution\Winapi. Другие примеры использования внешних функций и передачи параметров смотрите в модуле: Registry.prg, который размещен в подкаталоге Visual FoxPro ...\Samples\Classes.

Если данные, с которыми вы работаете в системе Visual FoxPro, представляют собой некоторый Массив, то при необходимости передать Его во внешнюю функцию .DLL вам требуется выполнить преобразование Массива - перевод в символьную моно-строку в стиле языка "C". Если элементы массива являются числовыми значениями, 16-ти битными или 32-х битными, вам предварительно необходимо преобразовать их соответствующие 16-тиричные символьные значения перед тем как они будут помещены в общую символьную строку. Когда вы передаете адрес полученной строки элементов массива из Visual FoxPro во внешнюю функцию, там уже данные обрабатываются как Массив элементов. Пример описанного преобразования вы можете посмотреть в примере формы Syscolor.scx, который размещен в подкаталоге Visual FoxPro ...\Samples\Solution\Winapi.

См. также