我正在尝试使用带有js-ctypes的Firefox附加组件SDK来访问本地DLL的方法,但它无法正常工作。
main.js代码:
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "mysite.com",
contentScriptFile: data.url("myjs.js")
});
myjs.js代码只是:
Components.utils.import("resource://gre/modules/ctypes.jsm");
alert("hello world");
在Firefox的控制台上,我收到了这些消息:
The Components object is deprecated. It will soon be removed.
TypeError: Components.utils is undefined
没有发出“hello world”警告。
有什么问题?谢谢!
答案 0 :(得分:4)
您不能使用内容脚本中的js-ctypes - 内容脚本没有特权。您必须通过chrome authority:
在扩展程序中执行此操作var {Cu} = require("chrome");
var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", null);
var lib = ctypes.open(...);
答案 1 :(得分:1)
这不是一个ctypes问题。
您无法从该上下文发出警报。 alert是窗口上的一种方法。所以你可以做两件事之一:
获取最新窗口并在那里运行警报。
Components.utils.import('resource://gre/modules/Services.jsm');
Services.wm.getMostRecentWindow(null).alert('hello world');
使用提示服务:example at mdn
Components.utils.import('resource://gre/modules/Services.jsm');
Services.prompts.alert(null, 'Hello World TITLE', 'hello world message');
此外,如果您使用的是addon sdk,则无法访问Components
,因此您无法执行Components.utils.import
,您必须将此const {Cu} = require('chrome');
放在main.js的顶部。你可以做Cu.import('blah')