如何在Firefox附加组件中找到与system / child_process API一起使用的文件?

时间:2016-06-16 16:53:15

标签: firefox-addon firefox-addon-sdk

我想写一个Firefox插件,它与本地安装的程序通信以交换数据。看起来可以使用js-ctypes或低级system/child_process API完成此操作,后者为recommended solution

child_process API上诉是因为它通过管道而不是直接在C接口级别抽象地发送和接收数据。但是,要使用它,您需要(似乎)在代码中提供可执行文件的完整路径:

var child_process = require("sdk/system/child_process");
var ls = child_process.spawn('/bin/ls', ['-lh', '/usr']);

在我的情况下,可执行文件由另一个应用程序安装,我们不知道它的确切位置 - 它将根据操作系统,用户的驱动器以及可能的用户偏好而有所不同。我想这个问题对于大多数没有内置于操作系统的可执行文件都是常见的。所以我的问题是:我有什么方法可以找到我想要使用的可执行文件的完整路径?我需要支持多个操作系统,但如果需要,可能会为每个操作系统提供不同的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是我在Windows上使用的代码 - 关键是能够读取环境变量以找到相应应用程序文件夹的位置。之后,我假设我的应用程序存储在一个众所周知的子路径下(我们不允许自定义它)。

var system = require("sdk/system");
var iofile = require('sdk/io/file');
var child_process = require('sdk/system/child_process');

var progFilesFolder = system.env["programfiles(x86)"],
    targetFile = iofile.join(progFilesFolder, 'FolderName', 'Program.exe');
    targetFileExists = iofile.exists(targetFile);

if (targetFileExists) {
    var p = child_process.spawn(targetFile);
}

我还没有为Mac编写代码,但我希望它类似,不同之处在于没有驱动器号可以担心并且OS X中的系统文件夹具有标准名称(即使是本地化的)系统)。