在firefox ChromeWorker中使用ctypes功能

时间:2014-11-25 21:07:16

标签: firefox firefox-addon firefox-addon-sdk jsctypes

我正在尝试使用ChromeWorker启动后台进程,如下所示:

var worker = new ChromeWorker(data.url("stun-manager.js"));
worker.addEventListener('message', function(e) {
    console.log(e.data);
}, false);

worker.postMessage({'cmd': 'start', 'msg': 'Hi'});

但我到底在哪里宣布我的所有ctypes等等?有趣的是,在stun-manager.js中,如果我有以下内容:

dump ("Message 1");
var {Cu} = require("chrome");
dump ("Message 2");

/*import js-ctypes */
var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm")
var stun_driver = ctypes.open("C:\\Users\\derek_000\\Documents\\Visual Studio 2012\\Projects\\stunnel507\\stunnel507\\bin\\win32\\stun_driver.dll");

const launch_stun = stun_driver.declare("launch_stun", ctypes.default_abi, ctypes.int32_t,  ctypes.int32_t, ctypes.char.ptr.ptr);

let argv_t = ctypes.ArrayType(ctypes.char.ptr);
let argc = 2;
let argv = new argv_t(argc);
var conf_path = "C:\\Users\\derek_000\\Documents\\Visual Studio 2012\\Projects\\stunnel507\\stunnel507\\stunnel.conf";
argv[0] = ctypes.char.array()(conf_path);
argv[1] = ctypes.char.array()(conf_path);

self.addEventListener('message', function (e) {
    var data = e.data;
    switch (data.cmd) {
        case 'start':
            self.postMessage("Value of launch_stun " + self.launch_stun);
            self.postMessage('WORKER STARTED: ' + data.msg);
            self.postMessage("debug" + self.argv_t);
            self.postMessage("test: " + self.argv_t);
            self.postMessage(self.argv[0].readString());
            launch_stun(argc, argv );
            break;
        case 'stop':
            self.postMessage('WORKER STOPPED: ' + data.msg +
                             '. (buttons will no longer work)');
            self.close(); // Terminates the worker.
            break;
        default:
            self.postMessage('Unknown command: ' + data.msg);
    };
}, false);

“消息2”从不打印到屏幕上,“消息1”是。这几乎就像我从其他行中获得了一个无声的失败,但这是我在尝试使用ChromeWorker之前从main.js启动它的确切代码。

有什么想法吗?我想似乎stun-manager.js默默地失败,并且在相关的说明中,我甚至无法在浏览器工具箱中找到它进行调试,但我确实在那里看到了我的main.js文件。

1 个答案:

答案 0 :(得分:2)

使用ChromeWorker的两个简单示例(以及ChromeWorker的进步,PromiseWorker,顺便提一下):

你不能在工人中做var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm")(你的工人是stun-manager.js)。这导致错误,删除它。您只需使用ctypes而无需导入任何内容,ChromeWorker会自动拥有它。那应该解决它。

我会更多地查看您的代码,但请务必查看ChromeWorker repo,它会有很多帮助,它是worker和main之间非常基本的消息传递。