Метод ДИНАМИЧЕСКАЯ_БИБЛИОТЕКА. ВЫЗОВ
Метод ВЫЗОВ позволяет вызвать функцию из динамической библиотеки (DLL), ранее загруженной методом ЗАГРУЗИТЬ. Список параметров задается с помощью специальных управляющих слов, описывающих способ передачи параметра, тип параметра и выражение/переменную для обмена.
Замечание: динамические библиотеки (DLL) не поддерживают механизма, позволяющего определить список параметров и тип возвращаемого значения функций, поэтому правильность описания вызова функции критически важна. Неправильное оформление вызова из динамической библиотеки практически неминуемо приведет к сбою в работе платформы и потере данных. При возникновении затруднений обратитесь за помощью к специалисту.
ФУНКЦИЯ ЛОГИКА: ВЫЗОВ(СТРОКА: имя_функции <конвенция вызова> = STDCALL <описание параметра 1> <описание параметра 2> ...)
Параметры
- имя_функции
- Имя функции, экспортируемой из библиотеки.
- конвенция вызова
- STDCALL или CDECL, по умолчанию STDCALL. В 64 битной версии платформы этот параметр не учитывается.
- описание параметра N
- Описание параметра или возвращаемого значения:
<тип передачи>:<тип данных>:<выражение/переменная>
тип передачи – определяет входной и/или выходной параметр или возвращаемое значение:IN – входной параметр; OUT – выходной параметр; INOUT – входной и выходной параметр; RETURN – возвращаемое значение, только один параметр в списке может иметь этот тип передачи. 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: длина) // возвращает полную длину текста ОТЛАДКА(длина) ОТЛАДКА(текст) КОНЕЦ_ЕСЛИ