【问题标题】:Is it possible to call native Linux API from a Windows application running in Wine?是否可以从在 Wine 中运行的 Windows 应用程序调用本机 Linux API?
【发布时间】: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 本身。

标签: c++ c dll wine


【解决方案1】:

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

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

...

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

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

【讨论】:

  • 谢谢!这不是我想到的直接本地调用方法,但它确实有意义。使用 Wine 自己的工具来构建 Wine DLL。我试试看。
猜你喜欢
  • 2012-12-24
  • 2013-02-28
  • 1970-01-01
  • 2014-02-06
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多