3

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

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

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

4

1 回答 1

4

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

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