Руководство разработчика

Метод ДИНАМИЧЕСКАЯ_БИБЛИОТЕКА. ВЫЗОВ

Метод ВЫЗОВ позволяет вызвать функцию из динамической библиотеки (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;
Для входных параметров типов STRING и WSTRING можно указать размер буфера и приема измененной строки: STRING[N] или WSTRING[N], где N – размер буфера в символах (не включая завершающий 0). По умолчанию используется размер буфера 4095 символов.

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

ДА – при успешном вызове, НЕТ – в противном случае.

Пример 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: длина) // возвращает полную длину текста

ОТЛАДКА(длина) 
ОТЛАДКА(текст)        
КОНЕЦ_ЕСЛИ

См. также: