Распечатать страницу

Вызов внешних функций в Microsoft VFP

« Назад

Команда

DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName]
                   [cParamType1 [@] ParamName1, cParamType2 [@] ParamName2, ...]

регистрирует в VFP функцию внешней разделяемой 32-битовой динамической библиотеки (DLL).

Опция и параметры:

cFunctionType – задает тип данных (табл. 5.6), возвращаемой функцией величины; если функция не возвращает значения, то параметр опускается.

Таблица 5.6

Возможные значения параметров cFunctionType и cParameterType1

cFunctionType

Описание

Short

16-битовое целое

Integer

32-битовое целое

Single

32-битовое с плавающей точкой

Double

64-битовое с плавающей точкой

Long

32-битовое длинное целое

String

Строка символов

Object

Объект типа IDispatch

FunctionName – имя функции разделяемой библиотеки для регистрации в VFP. Имя функции, задаваемое этим параметром, чувствительно к регистру.

Замечание. Имя DLL-функции может отличаться от имени, заданного в Win32 API (API – application programming interface). Например, функция MessageBox должна получить имя MessageBoxA в случае однобайтовых символов или MessageBoxW – в случае UNICODE. Если VFP не может найти функцию, заданную параметром FunctionName, то в конец ее имени добавляется латинская буква A и поиск повторяется.

Если функция разделяемой библиотеки имеет то же имя, что и одна из функций (процедур) VFP, или ее имя неприемлемо для VFP, то используется опция AS.

IN LibraryName – задает имя внешней разделяемой библиотеки, содержащей функции, заданные параметром FunctionName.

Если в качестве LibraryName задано значение WIN32API, то VFP ищет 32-битовые Windows DLL-функцию в Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll и Advapi32.dll

AS AliasName – имя псевдонима функции разделяемой библиотеки. Имя AliasName должно быть уникальным. Если псевдоним задан, то он используется для вызова функции. Имя AliasName нечувствительно к регистру.

cParameterType1 [@] ParamName1, cParameterType2 [@] ParamName2, ... – типы параметров, передаваемых функции разделяемой библиотеки. Возможные значения типов параметров см. в табл. 5.6, например:

declare Integer AccessibleObjectFromWindow in Oleacc.dll Integer, Integer, String, Object @

VFP генерирует ошибку, если параметр указан неверно. NULL-величина может быть передана как строка нулевой длины.

При передаче параметра по ссылке после его имени указывается знак @. При вызове функции этот знак указывается уже перед именем параметра.

Имена ParamName1, ParamName2, … параметров необязательны и употребляются в качестве справочной информации об именах, используемых в объявлении функции разделяемой библиотеки.

Для совместимости с предыдущими версиями VFP позволяет вызывать внешние API-библиотеки, используя команду SET LIBRARY (используя SET LIBRARY можно получить доступ к функциям FoxTools.fll.) Однако команда DECLARE – DLL предпочтительнее.

Тип Object для параметра cFunctionType введен для некоторых ActiveX Accessibility API-процедур, но может быть употреблен как родовой с другими Windows API-процедурами.

Пример. Получаем год, номер месяца, дня недели и дня месяца.

declare Integer GetSystemTime in Win32api String @

cBuff = Space(40)

GetSystemTime(@cBuff)    && Вызов внешней функции

tYear = Asc(Substr(cBuff, 2)) * 256 + Asc(Substr(cBuff, 1))

tMonth = Asc(Substr(cBuff, 3))

tDow = Asc(Substr(cBuff, 5))

tDay = Asc(Substr(cBuff, 7))

? tYear, tMonth, tDow, tDay

clear dlls "GetSystemTime"

Замечание. Для знакомства с процедурами API-библиотек см. в справке VFP тему API library routines.

Команда

CLEAR DLLS cAliasNameList

удаляет из памяти внешние функции разделяемых библиотек, загруженные командой DECLARE – DLL.

cAliasNameList – разделенные запятыми имена псевдонимов функций, удаляемых из памяти, например:

clear dlls "RegCloseKey", "RegOpenKey"

Если в команде DECLARE – DLL псевдонимы не использовались, то в списке cAliasNameList указываются имена функций.

Для получения списка загруженных функций DLL-библиотек можно употребить функцию ADLLS( ).

Команда

SET LIBRARY TO [FileName [ADDITIVE]]

открывает внешний файл API-библиотеки или файл с процедурами (функциями) VFP.

Опция и параметр:

FileName – имя файла API-библиотеки или файла с процедурой. По умолчанию принимается расширение FLL. Для файла с процедурами по умолчанию берется расширение PRG.

При использовании SET LIBRARY следует учитывать, что нельзя смешивать версии, например нельзя использовать в VFP библиотеки, построенные для FoxPro версии 2.6. Они должны быть откомпилированы и построены в VFP заново.

ADDITIVE – открывает дополнительные API-библиотеки. В случае открытия процедуры опция игнорируется.

Команда SET LIBRARY TO без параметра FileName и/или опции ADDITIVE удаляет из памяти все зарегистрированные API-библиотеки. Для удаления определенной библиотеки используется RELEASE LIBRARY LibraryName.

Замечание. Если SET LIBRARY открывает файл с процедурами, то все ранее открытые API-библиотеки будут закрыты. И наоборот, если SET LIBRARY открывает API-библиотеку, то закрываются ранее открытые командой процедуры. Предпочтительнее использовать для открытия файла с процедурами SET PROCEDURE, а DECLARE – DLL для API-библиотек.

Команда

RELEASE LIBRARY LibraryName

удаляет внешнюю API-библиотеку LibraryName из памяти.