是否可以从在 Wine 中运行的 Windows 应用程序调用本机 Linux API?

Posted

技术标签:

【中文标题】是否可以从在 Wine 中运行的 Windows 应用程序调用本机 Linux API?【英文标题】:Is it possible to call native Linux API from a Windows application running in Wine? 【发布时间】:2017-01-27 05:06:58 【问题描述】:

场景

我有一个为 Windows 应用程序(使用 C++)编写的插件 (dll)。

该应用程序在 Wine 下的 Linux 上运行良好,但是,在插件中我想使用 Wine 中尚不可用的功能。

假设我可以在运行时检测到应用程序正在 Wine 中运行,我是否可以动态加载本机 Linux 库(或以任何其他方式访问本机 Linux API)以模拟所述功能?

我很好奇这是否可以在没有任何严重黑客攻击的情况下完成。

【问题讨论】:

写一个原生的Linux应用怎么样?如果做得“正确”,您最终将获得适用于 Linux 和 Windows 的跨平台解决方案。但这仍然是一个有趣的问题。 谢谢,但我正在为 foobar2000 编写一个插件,这是一个仅限 Windows 的闭源音乐播放器。 我会编写一个跨平台的可执行程序,以及两个特定于操作系统的小型可加载插件,它们通过管道或其他机制与之对话。 我们到底在谈论什么 API? Wine 在 Linux 上提供 Windows 功能。您是说您想使用 Wine 尚不支持的 Windows 功能,因此您打算效仿它吗?如果您打算这样做,那么也许您应该将该功能添加到 Wine 本身。 【参考方案1】:

似乎有人遇到过类似的问题,或者至少已经预测到了这种情况。 Wrapper-library 应该可以帮到你:

出于某种原因,您可能会发现自己使用 Linux 库 您想像使用 Windows DLL 一样使用它。有各种 原因包括:

...

    您有一个可以扩展的仅二进制 Windows 应用程序 通过插件,例如文本编辑器或 IDE。

简而言之 - 您应该创建精简的 Wine 内置 dll,它就像您的 PE 二进制文件的 ABI 和本机 Linux 库的 ABI 之间的桥梁。然后你应该将你的代码链接到这个包装器。对于 Windows 发行版,您可以提供带有空存根的“包装器”。这种方法允许您为您的插件使用一个二进制文件,它将在 Linux 上使用特定于 wine 的功能包装 DLL,在 Windows 上使用存根 DLL。

【讨论】:

谢谢!这不是我想到的直接本地调用方法,但它确实有意义。使用 Wine 自己的工具来构建 Wine DLL。我试试看。

以上是关于是否可以从在 Wine 中运行的 Windows 应用程序调用本机 Linux API?的主要内容,如果未能解决你的问题,请参考以下文章

在linux下使用wine平台(比如 VS平台,浩方)运行魔兽争霸.exe 是否不可能,本人linux菜鸟,求高手指点。

Windows 自动化 - 从在 Windows 中运行的应用程序中获取文本

如何在 Ubuntu 22.04 上安装 最新版本Wine

Wine 8.0 发布,终于可以在 Linux 上流畅的运行 Windows 应用程序了!

wine运行程序时报错问题

如何安装和使用Wine,以便在Linux上运行Windows应用程序