Метод ДИНАМИЧЕСКАЯ_БИБЛИОТЕКА. ВЫЗОВ
Метод ВЫЗОВ позволяет вызвать функцию из динамической библиотеки (DLL), ранее загруженной методом ЗАГРУЗИТЬ. Список параметров задается с помощью специальных управляющих слов, описывающих способ передачи параметра, тип параметра и выражение/переменную для обмена.
Замечание: динамические библиотеки (DLL) не поддерживают механизма, позволяющего определить список параметров и тип возвращаемого значения функций, поэтому правильность описания вызова функции критически важна. Неправильное оформление вызова из динамической библиотеки практически неминуемо приведет к сбою в работе платформы и потере данных. При возникновении затруднений обратитесь за помощью к специалисту.
ФУНКЦИЯ ЛОГИКА: ВЫЗОВ(СТРОКА: имя_функции
<конвенция вызова> = STDCALL
<описание параметра 1>
<описание параметра 2>
...)
Параметры
- имя_функции
- Имя функции, экспортируемой из библиотеки.
- конвенция вызова
- STDCALL или CDECL, по умолчанию STDCALL. В 64 битной версии платформы этот параметр не учитывается.
- описание параметра N
- Описание параметра или возвращаемого значения:
<тип передачи>:<тип данных>:<выражение/переменная>
тип передачи – определяет входной и/или выходной параметр или возвращаемое значение:
тип данных – описание типа параметра и размера буфера для выходных параметров:IN – входной параметр; OUT – выходной параметр; INOUT – входной и выходной параметр; RETURN – возвращаемое значение, только один параметр в списке может иметь этот тип передачи.
Для входных параметров типов STRING и WSTRING можно указать размер буфера и приема измененной строки: STRING[N] или WSTRING[N], где N – размер буфера в символах (не включая завершающий 0). По умолчанию используется размер буфера 4095 символов.INT или INT32 – целочисленное знаковое, 32 бит; UINT или UINT32 – целочисленное беззнаковое, 32 бит; POINTER или HANDLE – указатель или дескриптор, 32 или 64 бит – в зависимости от платформы. STRING – строка однобайтных символов (char), завершенная 0; WSTRING – строка двухбайтных символов (wchar_t), завершенная 0;
Возвращаемое значение
ДА – при успешном вызове, НЕТ – в противном случае.
Пример 1
ПЕРЕМ ДИНАМИЧЕСКАЯ_БИБЛИОТЕКА: длл
длл.ЗАГРУЗИТЬ("user32")
ПЕРЕМ ЧИСЛО: код
длл.ВЫЗОВ("MessageBoxA": STDCALL,
IN: HANDLE: "0x0", // HWND окна-родителя
IN: STRING: "Привет!", // передаем текст как ANSI-строку
IN: STRING: "Заголовок", // передаем заголовок как ANSI-строку
IN: UINT32: 36, // MB_YESNO | MB_ICONQUESTION – битовые флаги
RETURN: INT32: код) // возвращаемое значение – код нажатой кнопки
ОТЛАДКА(код)
длл.ВЫЗОВ("MessageBoxW": STDCALL,
IN: HANDLE: "0x0", // HWND окна-родителя
IN: WSTRING: "Привет!", // передаем текст как UNICODE-строку
IN: WSTRING: "Заголовок", // передаем заголовок как UNICODE-строку
IN: UINT32: 36, // MB_YESNO | MB_ICONQUESTION – битовые флаги
RETURN: INT32: код) // возвращаемое значение – код нажатой кнопки
ОТЛАДКА(код)
Пример 2
ПЕРЕМ ДИНАМИЧЕСКАЯ_БИБЛИОТЕКА: длл
длл.ЗАГРУЗИТЬ("user32")
ПЕРЕМ СТРОКА: hwnd
длл.ВЫЗОВ("FindWindowW": STDCALL, // ищем окна по имени класса
IN: WSTRING: "AthenaMainWnd", // имя класса
IN: WSTRING: "",
RETURN: HANDLE: hwnd) // получаем дескриптор окна или "0x0"
ОТЛАДКА(hwnd)
ПЕРЕМ ЦЕЛОЕ: длина
ПЕРЕМ СТРОКА: текст
ЕСЛИ hwnd <> "0x0" ТО // если окно найдено
длл.ВЫЗОВ("GetWindowTextW": STDCALL, // получаем текст заголовка
IN: HANDLE: hwnd, // указываем дескриптор окна
OUT: WSTRING[1000]: текст, // переменная "текст" для получения текста, буфер на 1000 символов
IN: INT32: 1000, // максимальная длина принимаемого текста
RETURN: INT32: длина) // возвращает полную длину текста
ОТЛАДКА(длина)
ОТЛАДКА(текст)
КОНЕЦ_ЕСЛИ