Можно ли вызывать Windows API из Форта?

В C/C++ исполняемые файлы Windows связаны со статическими библиотеками, которые импортируют DLL-файлы, содержащие процедуры Windows API.

Но как нам получить доступ к этим процедурам из кода Forth (например, GForth)? Это вообще возможно?

Я знаю, что есть Win32Forth, способный делать вещи Win32, но мне интересно, как (и если) это можно было бы сделать в реализациях Forth, которые не имеют этой функциональности из коробки (но работают на целевой ОС и потенциально могут взаимодействовать с ним на определенном уровне).

Что в настоящее время приходит мне на ум, так это загрузить рассматриваемые файлы DLL и каким-то образом определить адрес процедуры для выполнения, но затем выполнить как? (Все, что я знаю, это то, что Windows API использует соглашение stdcall). И как нам найти процедуру без заголовка C? (Я новичок в Forth и чуть менее новичок в C++. Пожалуйста, потерпите меня, если мои размышления бессмысленны).


person sunny moon    schedule 06.09.2015    source источник


Ответы (3)


Да, вы можете сделать это в Gforth в соответствии с его документацией. Самая большая проблема будет связана с обратными вызовами, на которые API Windows довольно сильно опирается. Для решения этой проблемы существует неподдерживаемый пакет, см. 5.25.6 Обратные вызовы. Я не пытался сделать это сам в Gforth, но документация выглядит адекватной.

Вы также можете проверить VFXForth компании MPE. С их сайта:

Доступ к API Windows

VFX Forth может получить доступ ко всем стандартным вызовам Windows API, а также к функциям любых других библиотек DLL. Функциональный интерфейс позволяет определять вызовы API путем копирования и вставки из справочных руководств по другим языкам, например:

EXTERN: int PASCAL CreateDialogIndirectParam( HINSTANCE, void *,HWND, WNDPROC, LPARAM );
EXTERN: int PASCAL SetWindowText( HANDLE, LPSTR );
EXTERN: HANDLE PASCAL GetDlgItem( HANDLE, int );

Это немного ниже по странице VFX Forth для Windows.

Поскольку я делаю свой Forth на Mac и Linux, я не могу работать с Windows для Gforth, чтобы предоставить более подробную информацию, извините.

person Blame Troi    schedule 07.09.2015

В общем случае для реализации интерфейса сторонних функций (FFI) для динамически загружаемых библиотек в какой-либо системе Forth в качестве расширения (т.е. без изменения исходного кода и перекомпиляции) нам потребуются функции dlopen и dlsym, ассемблер Forth и глубокое знание языка Forth. -системная организация и ABI. Иногда это можно было сделать даже без ассемблера. Например, несмотря на то, что SP-Forth имеет FFI, иностранные звонки также были реализовано на чистом Форте в результате генерации собственного кода и объединение стека возврата с собственным аппаратным стеком.

Что касается Gforth, кажется, что в версии 0.7.9 (см. релизы) он не иметь стандартное соглашение о вызовах FFI для stdcall (оно поддерживает только cdecl), хотя у него есть dlopen и dlsym и ассемблер. Таким образом, должно быть возможно реализовать FFI для stdcall.

person ruvim    schedule 07.09.2015

Gforth 0.7.9 предоставляет вызовы Windows API, сгенерированные Swig из заголовочных файлов Windows. Интерфейс C использует библиотеку-оболочку, которая компилируется компилятором C, для передачи параметров из стека Forth в системные функции; поскольку компилятор C понимает stdcall, а файлы заголовков объявляют Windows API как stdcall, это «просто работает».

Поскольку все предварительно сгенерированные привязки C находятся в каталоге «unix» (по историческим причинам), include unix/win32.fs дает вам часть Win32 API Windows.

Обратные вызовы в цикле событий по-прежнему являются проблемой, поскольку Gforth — это программа Cygwin, а Cygwin имеет свою специальную задачу цикла событий... но я надеюсь, что эту проблему можно решить.

person forthy42    schedule 05.11.2016
comment
Удивительно и полезно знать, что Gforth для Windows — это приложение на основе Cygwin. Я думал что версия для винды она родная. - person ruvim; 12.11.2016