【问题标题】:Couldn't open library (error 126) using ctypes.open in firefox addon无法在 firefox 插件中使用 ctypes.open 打开库(错误 126)
【发布时间】:2016-01-18 20:04:35
【问题描述】:

开发 Firefox 插件,使用 ctypes 加载自定义 DLL - 在我的真实计算机(win 7/64)上,DLL 加载顺利,但在我使用相同操作系统的测试 VM 中,发生以下错误:

console.error: bzaddon:
  Message: Error: couldn't open library .\BZAddOnHelper.dll: error 126
  Stack:
    @resource://bzaddon/index.js:25:11
run@resource://gre/modules/commonjs/sdk/addon/runner.js:145:19
startup/</<@resource://gre/modules/commonjs/sdk/addon/runner.js:86:7
Handler.prototype.process@resource://gre/modules/Promise-backend.js:867:23
this.PromiseWalker.walkerLoop@resource://gre/modules/Promise-backend.js:746:7
this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise-backend.j
s:688:37

加载库的代码:

// Get the chrome components
let { Ci, Cu, Cr } = require('chrome');
// Get ctypes
Cu.import("resource://gre/modules/ctypes.jsm");
// External DLL
var lib = ctypes.open(".\\BZAddonHelper.dll");

我什至尝试使用完全空的 DLL,它不依赖于 msvc*:

screenshot of 'depends' on the target vm

我尝试使用将 DLL 移动到数据目录并使用 self.data.url 并且根本不使用路径。我尝试使用完整路径。唯一可行的是将我的 DLL 复制到 SysWow64(DLL 是 32 位,因为 firefox 是 32 位)。同样,在我的(开发)机器上运行它可以使用“.\dllname” - 但不能在任何其他计算机上运行......我完全不知所措......有人吗?

【问题讨论】:

  • 更新:在运行 Windows 7/32 的 VM 上得到了相同的结果......
  • 更新 2:通过我自己的 DLL 从 C:\windows\system32 复制 kernel32.dll 得到了相同的结果...而且我很确定 kernel32.dll 可以由系统:)
  • 请看这篇文章:developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/…。当您尝试使用 kernel32 时,如果您使用完整路径,则需要双反斜杠。或者你应该只是var lib = ctypes.open('kernel32')。在您上面的主题帖子中,对于您的自定义 dll,您使用的是相对路径,您必须使用完整路径,并且它不能是 chrome 路径,您必须从中创建一个文件 uri。文件 uri 是 file://blah/blah/blah.dll
  • @Noitidart 我将 kernel32 复制到我自己的 DLL 上,以确保问题不在于 DLL 本身(未解决的依赖关系、DllMain 中的故障等)。对于我的一生,我不记得我在哪里看到在 ctypes.open() 中使用“.\DllName.dll”将从插件目录中获取它 - 但是,它很大,但是在我的开发机器上它可以工作!在任何其他计算机上都没有。无论如何...我总是可以将我们的辅助 DLL 安装到 system32 中,因为插件只是更大产品的一部分...所以如果一切都失败了 - 这就是我最终要做的...
  • @Noitidart 谢谢!请重新发布作为答案,我会为你 +1 :)

标签: c firefox dll firefox-addon jsctypes


【解决方案1】:

您不应该安装到 system32,请参阅这个使用自定义 dll 的工作插件:github.com/NoitForks/Firefox_addon_sdk_jsctypes 和这个:github.com/NoitForks/fx-sapi-test 我确定你的错误是你不使用使用 file:// 协议的字符串。如果它在 C:\blah.dll 做 ctypes.open('file://C:/blah.dll')

【讨论】:

  • 在我获得“15 声望”之前,我的 +1 不会公开显示。伙计,这感觉就像一个 PS4 游戏;)
  • 哈哈,这很有趣,+1 没有问题。
  • 查看 NoitForks 中的代码后(并在 package.json 添加 unpack: true 后),我收到以下消息 - message = 组件返回失败代码:0x80004002 (NS_NOINTERFACE) [ns IFileURL.文件] - 名称 = NS_NOINTERFACE - 结果 = 2147500034 这是我的代码: var dataUrl = self.data.url("BZAddonHelper.dll"); var nuri = Services.io.newURI(dataUrl,null,null); var s = nuri.QueryInterface(Ci.nsIFileURL); var f = s.file(); //
  • 你能把你的代码上传到github repo,我自己测试一下
  • @eamonn 您要加载的 dll 是什么?它是与插件一起打包的dll吗?如果是,则必须将install.rdf 修改为&lt;em:unpack&gt;true&lt;/em:unpack&gt;,默认解包为false。如果它不是与您的插件 dll 打包的,那么您可以指定它的路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多