如何在Mozilla Firefox 32+插件中使用Windows本机dll?

时间:2014-10-15 19:16:29

标签: firefox-addon firefox-addon-sdk

我想恢复为Firefox 11创建的废弃附加组件。此附加组件通过本机dll控制设备。使用Firefox 32 addon-api和ctx,我看不到如何:

1)将冗长的自定义init代码插入bootstrap.js或harness-options.json。

2)在xpi存档中包含其他二进制文件

3)发现或确定在我的附加组件中使用外部代码的可执行路径

我有原始旧xpi的副本。我可以看到他们如何将所需的dll放在“。\ plugins \ 5.9.6.0000 \ foobar.dll”中。我可以看到他们在。\ bootstrap.js中使用了“安装”功能。我在这里包含了一些bootstrap.js的原始代码。

function registerPlugin()
{
   var profPath = Components.classes["@mozilla.org/file/directory_service;1"].getService( Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).path;  
var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
                    .createInstance(Components.interfaces.nsIWindowsRegKey);
wrk.open(wrk.ROOT_KEY_CURRENT_USER, "SOFTWARE", wrk.ACCESS_ALL);
if(!wrk.hasChild("MozillaPlugins"))
  wrk = wrk.createChild("MozillaPlugins", wrk.ACCESS_ALL);  
else
  wrk = wrk.openChild("MozillaPlugins", wrk.ACCESS_ALL);
var t1 = wrk.createChild("blueglow@hardcorps.com", wrk.ACCESS_ALL);
t1.writeStringValue("Description", "CanCan extension for BagMan");         
t1.writeStringValue("ProductName", "CanCan extension for BagMan");
t1.writeStringValue("Vendor", "Hardcorps Inc.");
t1.writeStringValue("Version", "5.9.6.0000");
t1.writeStringValue("Path", profPath + "\\extensions\\blueglow@hardcorps.com\\plugins\\5.9.6.0000\\foobar.dll" );
var t2 = t1.createChild("MimeTypes", wrk.ACCESS_ALL);
t2.createChild("application/blueglow-ff-plugin", wrk.ACCESS_ALL);
t2.close();
t1.close();
wrk.close();

Components.classes['@mozilla.org/appshell/window-mediator;1']
                       .getService(Ci.nsIWindowMediator)
                       .getMostRecentWindow('navigator:browser')
                       .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                       .getInterface(Components.interfaces.nsIWebNavigation)
                       .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                       .rootTreeItem
                       .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                       .getInterface(Components.interfaces.nsIDOMWindow).navigator.plugins.refresh(false);
}


function install(data, reason)
{
  registerPlugin();
}

1 个答案:

答案 0 :(得分:0)

将dll放入你的插件,然后通过js-ctypes使用它。

这是Mac上的一个示例,他们使用.dylib而不是.dll:

来源:https://github.com/vasi/firefox-dock-progress/tree/master

汇编来源:https://addons.mozilla.org/en-US/firefox/files/browse/185970/file/chrome/content/DockProgress.jsm