XPCOM 组件 DLL 加载到 Firefox 中,但随后无法注册其类

Posted

技术标签:

【中文标题】XPCOM 组件 DLL 加载到 Firefox 中,但随后无法注册其类【英文标题】:XPCOM component DLL loads into Firefox, but then fails to register its class 【发布时间】:2011-06-22 22:51:00 【问题描述】:

我有一个 XPCOM 组件,其源代码在编译后在 Linux 上运行良好,但在 Windows 上无法运行。正如依赖 walker 程序所揭示的那样,该 DLL 显然按 Firefox 的预期加载,但它似乎永远不会被它执行。

这是我用来编译它的命令行:

[4/5] cxx: components\nsSoundSubsystem.cpp -> build\components\nsSoundSubsystem.cpp.2.o
15:44:31 runner ['C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\BIN\\CL.exe', '/nologo', '/MT', '/IE:\\src\\chunder\\clients\\xpcomextension\\build', '/IE:\\src\\chunder\\clients\\xpcomextension', '/IE:\\src\\chunder\\clients\\xpcomextension\\build\\components', '/IE:\\src\\chunder\\clients\\xpcomextension\\components', '/IC:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\INCLUDE', '/IC:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\include', '/Ic:\\xulrunner-sdk\\include', '/DHAVE_XPCOM_CONFIG_H=1', '/DMOZ_NO_MOZALLOC', '/DWIN32', '/D_WINDOWS', '/D_USRDLL', '/DXP_WIN', '/DXP_WIN32', '/DXPCOM_GLUE_USE_NSPR', '..\\components\\nsSoundSubsystemModule.cpp', '/FC', '/c', '/Focomponents\\nsSoundSubsystemModule.cpp.2.o']
15:44:31 runner ['C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\BIN\\CL.exe', '/nologo', '/MT', '/IE:\\src\\chunder\\clients\\xpcomextension\\build', '/IE:\\src\\chunder\\clients\\xpcomextension', '/IE:\\src\\chunder\\clients\\xpcomextension\\build\\components', '/IE:\\src\\chunder\\clients\\xpcomextension\\components', '/IC:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\INCLUDE', '/IC:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\include', '/Ic:\\xulrunner-sdk\\include', '/DHAVE_XPCOM_CONFIG_H=1', '/DMOZ_NO_MOZALLOC', '/DWIN32', '/D_WINDOWS', '/D_USRDLL', '/DXP_WIN', '/DXP_WIN32', '/DXPCOM_GLUE_USE_NSPR', '..\\components\\nsSoundSubsystem.cpp', '/FC', '/c', '/Focomponents\\nsSoundSubsystem.cpp.2.o']
nsSoundSubsystem.cpp
nsSoundSubsystemModule.cpp
[5/5] cxxshlib: build\components\nsSoundSubsystemModule.cpp.2.o build\components\nsSoundSubsystem.cpp.2.o -> build\components\chunder_x86.dll build\components\chunder_x86.dll.manifest build\components\chunder_x86.lib
15:44:32 runner ['C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\BIN\\LINK.exe', 'components\\nsSoundSubsystemModule.cpp.2.o', 'components\\nsSoundSubsystem.cpp.2.o', '/OUT:E:\\src\\chunder\\clients\\xpcomextension\\build\\components\\chunder_x86.dll', '/LIBPATH:C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\LIB', '/LIBPATH:C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\lib', '/LIBPATH:c:\\xulrunner-sdk\\lib', 'xpcom.lib', 'xpcomglue_s_nomozalloc.lib', 'nspr4.lib', '/NOLOGO', '/MANIFEST', '/DLL', '/machine:I386', '/IMPLIB:components\\chunder_x86.lib']
   Creating library components\chunder_x86.lib and object components\chunder_x86.exp
15:44:33 runner ['C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\bin\\MT.exe', '/NOLOGO', '-manifest', 'E:\\src\\chunder\\clients\\xpcomextension\\build\\components\\chunder_x86.dll.manifest', '-outputresource:E:\\src\\chunder\\clients\\xpcomextension\\build\\components\\chunder_x86.dll;2']

在这场追逐中三天,我已经束手无策了。

我做错了什么?或者,我可以做些什么来帮助我调试问题?

附加信息:我使用 Firefox 4 运行模块,并使用 XULrunner 2.0 SDK 编译模块。 XPT 文件中的接口可以自行注册。

【问题讨论】:

附加信息:模块加载,然后根据 Firefox NSPR 日志立即卸载:[732140]:加载库 C:\Users\Rudd-O\AppData\Roaming\Mozilla\Firefox\Profiles\ hob5ycuo.default\extensions\chunder@me.com\components\chunder_x86.dll(加载库)[732140]:卸载库 C:\Users\Rudd-O\AppData\Roaming\Mozilla\Firefox\Profiles\hob5ycuo.default\ extensions\chunder@me.com\components\chunder_x86.dll 附加信息:DLL 显示,使用 dumpbin /exports,一个 NSModule 入口点 = _NSModule 错误提交:bugzilla.mozilla.org/show_bug.cgi?id=666450 补充信息:我试过 MSVC 10 和 MSVC 9,结果都一样。 【参考方案1】:

看看nsNativeModuleLoader::LoadModule,这里的依赖关系不是问题——失败的依赖关系会导致库一开始就没有加载,没有任何东西可以卸载。有两种情况会卸载库:符号NSModule 未定义或模块版本不匹配。根据您的描述,前者是问题所在,应该是NSModule 而不是_NSModule。所以我猜你使用的不是NSMODULE_DEFN() 宏。有关正确模块定义的示例,请参阅http://mxr.mozilla.org/mozilla-central/source/xpcom/sample/nsSampleModule.cpp。如果我的猜测不正确,请向我们展示您的模块定义代码。

【讨论】:

符号 NSModule 被定义为 _NSModule。它适用于 Linux。想法? 这在代码中:NSMODULE_DEFN(nsSoundSubsystemModule) = &kSoundSubsystemModule; am 使用有问题的宏 def。 :-( @Rudd-O:奇怪,这个宏解析为extern "C" __declspec(dllexport) mozilla::Module const *const NSModule = ...。如果我将其放入 CPP 文件并使用与 dumpbin 相同的命令行选项进行编译,则将 NSModule 显示为唯一导出,而不是 _NSModule 导出为 NSModule = _NSModule。不只是 _NSModule。

以上是关于XPCOM 组件 DLL 加载到 Firefox 中,但随后无法注册其类的主要内容,如果未能解决你的问题,请参考以下文章

帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)

Firefox 6:XPCOM 组件中的 QueryInterface(nsIDOMWindow::GetIID() 问题,用于从 js 传递的浏览器内容窗口

XPCOM 的 XPI 扩展

如何从 javascript xpcom 组件中使用 c++ xpcom 组件

注册 XPCOM 组件时出现问题

c++ XPCOM组件与COM服务之间的通信(IPC)