3

私は Firefox 拡張機能を開発しており、そこから外部バイナリを呼び出したいと考えています。標準入力/出力を使用して通信できれば素晴らしいので、可能な限り最良の (そして最も単純な) オプションを探しています。これは私がこれまでに学んだことです:

  • 戻り値として文字列を取得する必要があるため、nslProcessは適していません。nslProcess は終了コードのみを提供できます。
  • XPCOMを使用することもできますが、バイナリのコードを変更する必要がない方がよいでしょう (それは C です。BTW)。また、最もポータブルなソリューションを可能にしたいと考えています。
  • Protozilla IPC は解決策のように見えますが、このプロジェクトが維持されているかどうかはわかりません。最後のコミットは 10 年前です。

私が理解したように、この機能はコマンドライン gpg ツールを使用する Enigmail に実装されています。誰かがそれについていくつかの詳細を持っていますか?

4

1 に答える 1

4

私の知る限りでは、Enigmail はバイナリ XPCOM コンポーネントを使用してこれを実現していますが、通常、これは拡張機能の実行可能なソリューションではありません。また、標準入出力を介した別のプロセスとの通信は、Gecko プラットフォームの一部ではありません。したがって、次の 3 つのオプションがあると思います。

  1. js-ctypesを使用して、必要な OS 関数を直接呼び出します。たとえば、Windows ではCreateProcess、パラメータで標準入出力のハンドルを呼び出して指定しlpStartupInfoます。もちろん、ストリームを操作するには OS の機能も使用する必要があります。複数のオペレーティング システムをサポートする必要がある場合、これはすぐに大変なことになります。
  2. シェルを使用して出力をリダイレクトします。の代わりに使用する Unix ライクなシステムで、シェルを使用してコマンドを実行する方法については、この回答を参照してください。コマンド ライン アプリケーションの入力データを に書き込んでコマンドを実行することができます。コマンドが完了すると、出力が表示されます。実行中にアプリケーションと対話する必要がある場合、これは明らかに機能しません。"/bin/sh"env.get("COMSPEC")in.txtfoo < in.txt > out.txtout.txt
  3. アプリケーションを変更して、Gecko プラットフォームでサポートされている別の IPC アプローチを使用することができます。通常、これは にバインドされたTCP ソケットを使用localhostすることを意味します。または、動的ライブラリ ( .dllWindows.so上、Unix ライクなシステム上) に変換し、js-ctypesを介して通信します。
于 2012-06-02T06:45:42.747 に答える