我正在构建一个使用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中打开。
答案 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'));