Вызов внешних функций в Microsoft VFP
« Назад Команда DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName]
|
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 из памяти.