2012-07-16 7 views
0

외부 실행 파일을 사용하여 메시지 본문을 변형시키는 Thunderbird 확장 프로그램이 있습니다. 현재 내가 해킹-일을 그냥 /tmp/someBinary이 실행 파일을 배치하고 그래서 같이 호출 :URI를 사용하여 외부 바이너리를 참조하는 방법은 무엇입니까?

var exe = FileUtils.File("/tmp/someBinary"); 
var proc = Components.classes["@mozilla.org/process/util;1"] 
        .createInstance(Components.interfaces.nsIProcess); 
proc.init(exe); 
var args = [msgBody.path]; 
proc.run(true, args, args.length); 

이 분명히 바보, URI를 통해 그것을 호출하고 응용 프로그램 실행 파일을 번들 좋을 것입니다. 슬프게도, 제한된 JS는 다음과 같은 것을 찾았다는 의미입니다.

var URL = ios.newURI("chrome://myExtension/content/someBinary",null,null); 
var exe = URL.QueryInterface(Components.interfaces.nsIFileURL).file; 

그러나 이것은 적절하지 않습니다. 이 작업을 수행하는 일반적인 방법이 있습니까? chrome:// URL이 반드시 file:// URL로 해결되지 않습니다

var chromeRegistry = Components.classes["@mozilla.org/chrome/chrome-registry;1"] 
           .getService(Components.interfaces.nsIChromeRegistry); 
var URL = ios.newURI("chrome://myExtension/content/someBinary", null, null); 
URL = chromeRegistry.convertChromeURL(URL); 
var exe = null; 
if (URL instanceof Components.interfaces.nsIFileURL) 
    exe = URL.file; 

참고 :

+0

다음과 같이 시도하십시오. var nsIFileS = Components.interfaces.nsIFileURL; 그런 다음 nsIFileS.init (...)을 사용하여 URL을 – ama2

답변

2

당신은 당신이 가지고있는 URL가이 해결 무슨 크롬 레지스트리를 요청해야합니다. 일반적으로 확장은 압축 된 XPI 파일로 설치되며 OS는 실행할 수있는 파일이 아닌이 아카이브 내부의 파일에 대한 링크 만 가져옵니다. 따라서 install.rdf 파일에 <em:unpack> flag을 지정해야합니다.

이 방법은 간단하지만 시작 성능이 저하됩니다 (확장 관리자가 이유 때문에 확장명을 기본적으로 해제하지 않음). 따라서 더 나은 해결책은 실행 파일을 필요할 때 임시 디렉토리에 복사하는 것입니다.

+0

으로 초기화하십시오. 완벽합니다. 위대한 블라디미르입니다. –