我习惯使用Win32Ada库来调用我为Windows创建的终端程序的系统调用。系统调用足以实现控制台所需的控制,但Ada标准库中没有任何内容。检查GPS社区版的来源列表,我发现Win32Ada丢失了。我已经准备好继续使用Win32Ada了,但它的排除(如多年前Linux版本的POSIX排除情况)暗示有一种更好的方法来实现低级接口。任何人都可以给我最简单的代码或参考我如何以从现在开始支持的方式与Windows进行交互?
之前的例子:
pragma Ada_2012;
with Win32;
with Ada.Text_IO;
...
我不确定从GNAT社区版中排除win32ada
库意味着它已经过时了。该库仍在GitHub上可用,并且README文件中没有提到过时。您可能必须自己克隆,构建和安装它。
另请注意,win32ada
似乎针对32位以及64位Windows。据我所知,32位和64位Windows之间的区别归结为所用指针的大小。这些指针由ULONG_PTR
中定义的LONG_PTR
和win32.ads
类型表示,其中它们的大小使用Standard'Address_Size
定义; GNAT公开的属性。此外,win32ada
链接到user32.dll
和gdi32.dll
等文件,其名称中的数字为32,这与目标32位或64位Windows无关。这post。
话虽如此,作为替代方案,您可能也想检查GNAT.OS_Lib
。该软件包包含各种OS相关工具的抽象(另请参阅GPS IDE中的“帮助> GNAT运行时> GNAT> OS_Lib”)。根据此包而不是win32ada
可能会使您的程序在操作系统之间更加便携。
您可以查看Ada的Visual Studio插件,Visual Ada,它对Windows 64有一些UWP支持
Visual Studio Community edition是免费的。
如果你真的真的想使用win32ada,那么你可能需要联系AdaCore,看看他们是否支持它的付费版本,或者坚持使用GNAT GPL 2017 for windows 32bit(仍然是downloadable)提供的版本。您可以将它与来自msys2的更新的Ada编译器配对,后者具有维护的64位和32位版本的GNAT。
看看它是如何在GWindows中完成的:整个框架都为Win32和Win64构建。特别是,你会在GWindows.Types包中找到自动完成检测32对64位的方法:
type Handle is new System.Address;
Null_Handle : constant Handle := Handle (System.Null_Address);
type Wparam is mod 2 ** Standard'Address_Size;
type Lparam is new Wparam;
type Lresult is new Wparam;