2

我习惯于使用 Win32Ada 库为我为 Windows 创建的终端程序调用系统调用。系统调用足以实现对控制台所需的控制,但 Ada 标准库中没有。检查 GPS 社区版的来源列表,我发现 Win32Ada 不见了。我准备继续使用 Win32Ada,但它的排除暗示了它(就像几年前 Linux 构建的 POSIX 排除的情况一样),有一种更好的方法来实现低级接口。谁能给我最简单的代码或参考我如何以从现在开始支持的方式与 Windows 交互?

之前的例子:

pragma Ada_2012;
with Win32;
with Ada.Text_IO;
...
4

3 回答 3

3

我不确定win32ada从 GNAT 社区版中排除该库是否意味着它已经过时。该库仍然在GitHub 上可用,并且在 README 文件中没有提到过时。您可能只需要自己克隆、构建和安装它。

另请注意,这win32ada似乎针对 32 位和 64 位 Windows。据我所知,32 位和 64 位 Windows 之间的区别归结为所使用的指针的大小。这些指针由类型表示,ULONG_PTR并在使用;LONG_PTR定义win32.ads其大小的位置定义 。Standard'Address_SizeGNAT 公开的属性。此外,如本文所述,当涉及到针对 32 位或 64 位 Windows 时,win32ada链接到名称中带有数字 32 之类的文件user32.dll是无关紧要gdi32.dll

话虽如此,作为替代方案,您可能还想检查GNAT.OS_Lib. 该软件包包含对各种 OS 相关设施的抽象(另请参见 GPS IDE 中的“Help > GNAT Runtime > GNAT > OS_Lib”)。依赖于这个包而不是win32ada可能使您的程序在操作系统之间更具可移植性。

于 2019-04-19T22:29:26.687 回答
1

看看它是如何在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;
于 2019-04-24T08:25:23.997 回答
1

您可以查看 Ada 的 Visual Studio 插件,Visual Ada对 Windows 64 有一些 UWP 支持

Visual Studio 社区版是免费的。

如果您真的想使用 win32ada,那么您可能需要联系 AdaCore 并查看他们是否支持其付费版本,或者坚持使用 GNAT GPL 2017 for windows 32bit 提供的版本(仍可下载)。您可以将它与msys2中更新的 Ada 编译器配对,该编译器同时维护了 64 位和 32 位版本的 GNAT。

于 2019-04-19T20:34:39.513 回答