我正在开发Firefox扩展,并希望从中调用外部二进制文件.如果可以使用标准输入/输出进行通信,那将很好,所以我正在寻找最佳(和最简单)的选择.
这是我到目前为止所学到的:
> nslProccess不适合,因为我需要获取字符串作为返回值. nslProccess只能提供退出代码.
>我可以使用XPCOM,但是如果不需要修改二进制代码(C,BTW),我会更喜欢.我也想提供最便携的解决方案.
> Protozilla IPC看起来像一个解决方案,但是我不确定该项目是否得到维护.上一次提交是10年前.
据我了解,此功能是在Enigmail中实现的,它使用命令行gpg工具.有人对此有一些细节吗?
解决方法:
据我所知,Enigmail使用二进制XPCOM组件来实现此目的,通常这不是扩展的可行解决方案.而且,通过标准输入/输出与另一个进程进行通信不是Gecko平台的一部分.因此,我认为您有三种选择:
>使用js-ctypes直接调用必要的OS功能.例如.在Windows上,您将调用CreateProcess
并在lpStartupInfo参数中指定标准输入/输出的句柄.当然,您还必须使用OS功能来处理流.如果您需要支持多个操作系统,这很快就会变得很繁琐.
>使用外壳重定向输出.请参阅this answer,以了解如何在Windows上运行带有外壳程序的命令的工作方式,在类Unix系统上,应使用“ / bin / sh”而不是env.get(“ COMSPEC”).您可以将命令行应用程序的输入数据写入in.txt,然后运行命令foo<. in.txt> out.txt-完成命令后,输出将在out.txt中.显然,如果您需要在运行时与应用程序进行交互,则此方法将无效.
>您可以将应用程序更改为使用另一种IPC方法,这是Gecko平台支持的方法.通常,这意味着将using TCP sockets绑定到本地主机.或者,您将其变成一个动态库(在Windows上为.dll,在类Unix系统上为.so),然后通过js-ctypes与之通信.