从 Mozilla 扩展运行二进制文件的推荐方法(使用 std I/O 通信)



我正在开发一个Firefox扩展,并希望从中调用外部二进制文件。如果我可以使用标准输入/输出进行通信,那就太好了,所以我正在寻找最好(也是最简单的)选择。这是我到目前为止学到的:

  • nslProccess 不合适,因为我需要获取字符串作为返回值。 nslProccess 只能提供退出代码。
  • 我可以使用XPCOM,但我更喜欢如果我不需要修改二进制文件的代码(它是C,BTW)。我还想提供最便携的解决方案。
  • Protozilla IPC 看起来像一个解决方案,但我不确定这个项目是否得到维护。上一次提交是在 10 年前。

据我了解,此功能是在Enigmail中实现的,它使用命令行gpg工具。有人对此有一些细节吗?

据我所知,Enigmail使用二进制XPCOM组件来实现这一点,通常这不是扩展的可行解决方案。通过标准输入/输出与另一个进程进行通信不是Gecko平台的一部分。所以我认为你有三个选择:

  1. 使用 js-ctypes 直接调用必要的操作系统函数。 例如,在 Windows 上,您将调用CreateProcess并在 lpStartupInfo 参数中指定标准输入/输出的句柄。当然,您还必须使用操作系统功能来处理流。如果您需要支持多个操作系统,这很快就会变得非常棘手。
  2. 使用 shell 重定向输出。请参阅此答案,了解如何在Windows上运行带有shell的命令,在类Unix系统上使用"/bin/sh"而不是env.get("COMSPEC")。您可以将命令行应用程序的输入数据写入in.txt,然后运行命令foo < in.txt > out.txt - 命令完成后,输出将以out.txt显示。显然,如果您需要在应用程序运行时与应用程序进行交互,这将不起作用。
  3. 您可以将应用程序更改为使用不同的 IPC 方法,即 Gecko 平台支持的方法。通常,这意味着使用绑定到 localhost 的 TCP 套接字。或者你把它变成一个动态库(.dll在Windows上,.so在类Unix系统上),并通过js-ctypes与它进行通信。

最新更新