Winapi 可以从Forth调用Windows API吗?

Winapi 可以从Forth调用Windows API吗?,winapi,forth,gforth,Winapi,Forth,Gforth,在C/C++中,Windows可执行文件与导入包含Windows API过程的DLL文件的静态库相链接 但是我们如何从Forth代码(例如GForth)访问这些过程?有可能吗 我知道Win32Forth能够实现Win32功能,但我感兴趣的是,在缺乏这一功能的Forth实现中如何(以及是否)实现这一功能(但确实可以在目标操作系统上运行,并且可能能够在某个级别上与之交互) 我现在想到的是加载有问题的DLL文件,并以某种方式定位要执行的过程的地址——但是,如何执行呢?(我只知道Windows API使

在C/C++中,Windows可执行文件与导入包含Windows API过程的DLL文件的静态库相链接

但是我们如何从Forth代码(例如GForth)访问这些过程?有可能吗

我知道Win32Forth能够实现Win32功能,但我感兴趣的是,在缺乏这一功能的Forth实现中如何(以及是否)实现这一功能(但确实可以在目标操作系统上运行,并且可能能够在某个级别上与之交互)

我现在想到的是加载有问题的DLL文件,并以某种方式定位要执行的过程的地址——但是,如何执行呢?(我只知道Windows API使用
公约)。我们如何定位没有C头的过程?(我对FoeX非常新近,对C++有点不太熟悉。如果我的想法是胡说八道,请耐心听我的话。

< P>是的,你可以根据Gforth的文档来做这个。最大的问题是处理回调,Windows API非常依赖回调。有一个不受支持的包来处理此问题,请参阅。我本人在Gforth中没有尝试过这一点,但文档看起来已经足够了

您可能还想检查一下。从他们的网站:

Windows API访问

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 );
这是下一页一点


当我在Mac和Linux上进行Forth时,我无法通过Windows for Gforth提供更多详细信息,抱歉。

在一般情况下,为Forth系统中动态加载的库实现外部函数接口(FFI)作为扩展(即,不更改源代码和重新编译),我们需要
dlopen
dlsym
函数、Forth汇编程序,以及对Forth系统组织和ABI的深入了解。 有时即使没有汇编程序也可以完成。例如,虽然有FFI,但由于本机代码生成和返回堆栈与本机硬件堆栈的合并,外部调用也在纯Forth中


关于Gforth,在版本0.7.9(请参阅)中,似乎没有针对stdcall的FFI调用现成约定(仅限它),尽管它有,并且。因此,为stdcall实现FFI应该是可行的。

Gforth 0.7.9提供了Swig从Windows头文件生成的Windows API调用。C接口使用由C编译器编译的包装器库将参数从第四个堆栈传递给系统函数;由于C编译器理解stdcall,并且头文件将Windows API声明为stdcall,所以这“非常有效”

由于所有预生成的C绑定都位于目录“unix”(出于历史原因),
include unix/win32.fs
提供了Windows API的win32部分


事件循环中的回调仍然是一个问题,因为Gforth是一个Cygwin程序,Cygwin有其特殊的事件循环任务。。。但我希望这个问题能够得到解决。

知道Gforth for Windows是一个基于Cygwin的应用程序,这是一个奇迹,也是值得一提的。我认为Windows的版本是本机的。