大多数干净的 C API 将回调声明为回调函数和用户数据的组合。用户数据通常是无效的*。WinAPI 使用指针大小的整数 (lParam)。在进行厚绑定时,自然希望允许使用 Ada 2005 闭包代替 C 回调。
我有一个代码。它就像 GNAT 上的魅力一样(GPL 2012,x86-windows 至少经过测试),但通常不能保证 Run_Closure_Adapter.X 变量和 Run_Closure.X 参数将具有相同的内部结构。
问题是:是否有适当的(符合标准的)方法来做到这一点?也许涉及标记类型、接口或泛型的技巧。至少有一种方法可以做到这一点:在不同的任务中运行闭包执行器和闭包,并使用集合点。但这太慢了。
Closure_Test.adb:
with Closure_Lib; use Closure_Lib;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Fixed; use Ada.Strings.Fixed;
procedure Closure_Test is
procedure Closure_Tester is
Local_String : String := "Hello, world!";
procedure Closure is
begin
Put_Line (Local_String);
end Closure;
begin
Run_Closure (Closure'Access);
end Closure_Tester;
procedure Ada_Run_Closure (X : access procedure) is
begin
X.all;
end Ada_Run_Closure;
-- Nested_Closure fills the execution stack with
-- several …Run Code Online (Sandbox Code Playgroud) 这是十年来的主要障碍.据报道这是不可能的.论坛会谈提到了与设置和恢复GS有关的问题.Wine HQ FAQ仍然是指ABI不兼容页面,它不是实时维基页面,而是新闻档案链接.
Wine 2.0宣布支持macOS 64位.但是......怎么样?这不是所有macOS黑客都应该知道的吗?对于任何x86-64黑客来说,也许一些优雅(或肮脏)的技巧本身就很有趣.