如何在 Firefox 附加组件中找到要与 system/child_process API 一起使用的文件?
How can I locate a file to use with the system/child_process API within a Firefox add-on?
我想编写一个 Firefox 附加组件,与本地安装的程序通信以交换数据。看起来这可以使用 js-ctypes or the low-level system/child_process API, with the latter being the recommended solution.
来完成
child_process API 之所以吸引人,是因为它通过管道抽象地发送和接收数据,而不是直接在 C 接口级别。但是,要使用它,您需要(似乎)在代码中提供可执行文件的完整路径:
var child_process = require("sdk/system/child_process");
var ls = child_process.spawn('/bin/ls', ['-lh', '/usr']);
在我的例子中,可执行文件是由另一个应用程序安装的,我们不知道它的确切位置 - 它会根据 OS、用户的驱动器以及可能的用户偏好而有所不同。我想这个问题对于大多数未内置于 OS 的可执行文件来说是常见的。所以我的问题是:我必须用什么方法找到我想使用的可执行文件的完整路径?我将需要支持多个 OSes,但如果需要,大概可以为每个提供不同的解决方案。
谢谢!
这是我在 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 有标准名称(即使在本地化系统上)。
我想编写一个 Firefox 附加组件,与本地安装的程序通信以交换数据。看起来这可以使用 js-ctypes or the low-level system/child_process API, with the latter being the recommended solution.
来完成child_process API 之所以吸引人,是因为它通过管道抽象地发送和接收数据,而不是直接在 C 接口级别。但是,要使用它,您需要(似乎)在代码中提供可执行文件的完整路径:
var child_process = require("sdk/system/child_process");
var ls = child_process.spawn('/bin/ls', ['-lh', '/usr']);
在我的例子中,可执行文件是由另一个应用程序安装的,我们不知道它的确切位置 - 它会根据 OS、用户的驱动器以及可能的用户偏好而有所不同。我想这个问题对于大多数未内置于 OS 的可执行文件来说是常见的。所以我的问题是:我必须用什么方法找到我想使用的可执行文件的完整路径?我将需要支持多个 OSes,但如果需要,大概可以为每个提供不同的解决方案。
谢谢!
这是我在 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 有标准名称(即使在本地化系统上)。