Lib.CallFunction

From SunFlurry wiki
Jump to: navigation, search
  CallFunction (Вызов функций)
Объект:Библиотека
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, неверное имя функции, неверные аргументы, слишком много аргументов, системная ошибка при вызове
Визуальность:Нет

Функция вызывает зарегистрированную ранее функцию библиотеки по ее имени. Она отличается от непосредственного вызова функции <Библиотека>.<Имя функции>(<Аргументы>...) тем, что поддерживает имена с нестандартными символами и позволяет вызывать функции, имена которых хранятся в переменных, что иногда необходимо при написании сложных участков программ.

Синтаксис

Lib.CallFunction(<Имя функции (STRING)><Аргумент 1>,<Аргумент 2>,...):<Возвращенное значение>

Аргументы

  • <Имя функции (STRING)> - Аргумент задает имя функции. Поиск функций по их именам происходит без учета регистра.
  • <Аргумент ?> - (необязательный аргумент) Список аргументов, необходимых для вызова функции. Любой пропущенный аргумент будет заменен на альтернативу пустого значения при вызове (ноль, nil указатель и пр.). На данный момент система принимает и автоматически преобразует в аргументы следующие типы данных: числа (целые и вещественные), строки, буферы, записи. Планируется также использование объектов OLE. Аргументы, переданные, как переменные, могут быть обновлены значениями полученными из функции, если аргумент поддерживает адресацию "By ref" (см. Load).

Возвращаемое значение

Возвращается значение функции или пустое значение, если для функции не зарегистрировано возвращаемого значения.

Примеры

//Пример демонстрирует работу с глобальной функцией памяти GlobalMemoryStatusEx

//Пример возвращаемых значений для x86 клиента:
//Загрузка памяти: 17%
//Всего физической памяти: 16351.14Мб
//Доступно физической памяти: 13524.92Мб
//Максимум памяти для текущего процесса: 4095.88Мб
//Доступно памяти для текущего процесса: 3957.65Мб

//Пример возвращаемых значений для x64 клиента (Windows 7 x64):
//Загрузка памяти: 17%
//Всего физической памяти: 16351.14Мб
//Доступно физической памяти: 13453.49Мб
//Максимум памяти для текущего процесса: 8388607.88Мб
//Доступно памяти для текущего процесса: 8388462.27Мб

aKernel32:=Lib.Load("kernel32.dll");
aKernel32.RegisterFunction("GlobalMemoryStatusEx","stdcall","P","B32");
rMEMORYSTATUSEX:=MemoryRecord.Create("dwLength:UI32,dwMemoryLoad:UI32,ullTotalPhys:UI64,ullAvailPhys:UI64,"+
  "ullTotalPageFile:UI64,ullAvailPageFile:UI64,ullTotalVirtual:UI64,ullAvailVirtual:UI64,ullAvailExtendedVirtual:UI64");
rMEMORYSTATUSEX.Allocate();
rMEMORYSTATUSEX.dwLength:=rMEMORYSTATUSEX.Size();
If aKernel32.CallFunction("GlobalMemoryStatusEx",rMEMORYSTATUSEX) Then
  Message("Загрузка памяти: "+rMEMORYSTATUSEX.dwMemoryLoad+"%");
  Message("Всего физической памяти: "+Round(rMEMORYSTATUSEX.ullTotalPhys/1024/1024,2)+"Мб");
  Message("Доступно физической памяти: "+Round(rMEMORYSTATUSEX.ullAvailPhys/1024/1024,2)+"Мб");
  Message("Максимум памяти для текущего процесса: "+Round(rMEMORYSTATUSEX.ullTotalVirtual/1024/1024,2)+"Мб");
  Message("Доступно памяти для текущего процесса: "+Round(rMEMORYSTATUSEX.ullAvailVirtual/1024/1024,2)+"Мб");
EndIf;