是否可以从Forth调用Windows API?

时间:2015-09-06 22:12:23

标签: winapi forth gforth

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

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

我知道Win32Forth有能力做Win32的东西,但是我很感兴趣如何(如果)在Forth实现中可以做到这一点,但是从盒子中缺少这个功能(但是在目标操作系统上运行,并且可能在某个级别上与它进行交互。)

目前我想到的是加载有问题的DLL文件并以某种方式查找要执行的过程的地址 - 但是,然后执行如何? (我所知道的是Windows API使用stdcall 惯例)。我们如何找到没有C头的程序? (我对Forth很新,对C ++来说只是一点点新手。如果我的思考是胡说八道,请耐心等待。)

3 个答案:

答案 0 :(得分:3)

是的,您可以根据其文档在Gforth中执行此操作。最大的问题是处理回调,Windows API依赖回调。有一个不受支持的包来处理此问题,请参阅 5.25.6 Callbacks 。我自己并没有在Gforth尝试这个,但文档看起来已经足够了。

您可能还想查看MPE's VFXForth。来自他们的网站:

  

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 );

这是在 VFX Forth for Windows 的页面上。

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

答案 1 :(得分:3)

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

关于Gforth,似乎在版本7.9中它没有用于stdcall调用约定的FFI开箱即用(仅supports cdecl),尽管它有dlopen, dlsymassembler 。因此,为stdcall实现FFI应该是可行的。

答案 2 :(得分:2)

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

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

事件循环中的回调仍然是一个问题,因为Gforth是一个Cygwin程序,Cygwin有它的特殊事件循环任务......但我希望这个问题可以解决。