FF插件,js ctypes:无法打开库(dll)

时间:2014-10-23 20:02:12

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

我正在构建一个使用js-ctypes加载C库的firefox插件。该库包含在插件本身中(即在“数据”目录中)。它在Linux和OSX中运行良好,我分别在这里加载.so和.dylib文件。但是当我尝试在Windows中加载.dll时,它会失败并带有

消息:错误:无法打开库c:\ users ... \ appdata \ local \ temp ... \ customlib.dll

当我遵循路径时,customlib.dll文件确实是ctypes所在的位置。当我用dllexp打开它时,我看到所有的符号,所以我认为.dll本身就没问题。

我不确定要提供什么信息。这就是我试图用ctypes打开lib的方法

var {Cc, Cu, Ci} = require("chrome");
Cu.import("resource://gre/modules/Services.jsm");
var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", null);

function resolveToFile(uri) {
    var ResProtocolHandler = Services.io.getProtocolHandler("resource")
        .QueryInterface(Ci.nsIResProtocolHandler);
    var ChromeRegistry = Cc["@mozilla.org/chrome/chrome-registry;1"]
        .getService(Ci.nsIChromeRegistry);
    switch (uri.scheme) {
        case "chrome":
            return resolveToFile(ChromeRegistry.convertChromeURL(uri));
        case "resource":
            return resolveToFile(Services.io.newURI(ResProtocolHandler.resolveURI(uri), null, null));
        case "file":
            return uri.QueryInterface(Ci.nsIFileURL).file;
        default:
            throw new Error("Cannot resolve");
    }
}

function getLibName(){
    return "customlib.dll";
}

var loc = resolveToFile(Services.io.newURI(self.data.url(getLibName()),null,null));
var lib = ctypes.open(loc.path);

我从这里how to load dll from SDK addon data folder?得到了resolveToFile(),它就像魅力一样,它找到了包含在插件中的libs的正确路径。但同样,它不会在Windows中打开。

1 个答案:

答案 0 :(得分:1)

而不是var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", null);只做Cu.import("resource://gre/modules/ctypes.jsm");

此代码是从ChromeWorker运行的吗?

也这样做:

var self = require("sdk/self");
ctypes.open(self.data.url('customlib.dll'));