windows - 如何以 64 位 GNAT GPS 的新方式与 Windows 系统调用交互?
问题描述
我习惯于使用 Win32Ada 库为我为 Windows 创建的终端程序调用系统调用。系统调用足以实现对控制台所需的控制,但 Ada 标准库中没有。检查 GPS 社区版的来源列表,我发现 Win32Ada 不见了。我准备继续使用 Win32Ada,但它的排除暗示了它(就像几年前 Linux 构建的 POSIX 排除的情况一样),有一种更好的方法来实现低级接口。谁能给我最简单的代码或参考我如何以从现在开始支持的方式与 Windows 交互?
之前的例子:
pragma Ada_2012;
with Win32;
with Ada.Text_IO;
...
解决方案
我不确定win32ada
从 GNAT 社区版中排除该库是否意味着它已经过时。该库仍然在GitHub 上可用,并且在 README 文件中没有提到过时。您可能只需要自己克隆、构建和安装它。
另请注意,这win32ada
似乎针对 32 位和 64 位 Windows。据我所知,32 位和 64 位 Windows 之间的区别归结为所使用的指针的大小。这些指针由类型表示,ULONG_PTR
并在使用;LONG_PTR
定义win32.ads
其大小的位置定义 。Standard'Address_Size
GNAT 公开的属性。此外,如本文所述,当涉及到针对 32 位或 64 位 Windows 时,win32ada
链接到名称中带有数字 32 之类的文件user32.dll
是无关紧要的。gdi32.dll
话虽如此,作为替代方案,您可能还想检查GNAT.OS_Lib
. 该软件包包含对各种 OS 相关设施的抽象(另请参见 GPS IDE 中的“Help > GNAT Runtime > GNAT > OS_Lib”)。依赖于这个包而不是win32ada
可能使您的程序在操作系统之间更具可移植性。
推荐阅读
- entity-framework - 实体框架 6 关系和包容性问题
- python-3.x - Python 3.x 索引和切片
- arduino - ESP32 交替使用 BLE 和 WiFi
- azure - 我可以将代码从 DevOps 部署到在 Linux 容器上运行的 Azure Web 吗?
- javascript - 在 iframe 内的 iframe 滚动页面上
- identityserver4 - Identity Server 4 未释放内存
- sql - 带有平面文件源的 SSIS 平面文件目标
- javascript - 使用 PWABuilder 中的缓存优先网络服务工作者永远不会更新?
- r - 如何解决阻止我在 Ubuntu 18.04 上安装 R 4.0 的依赖项错误?
- python - 从 cron 运行脚本时运行外部程序