1

我编写了一个 NPAPI 插件,如果我将它放在 %ProgramFiles\Mozilla FireFox\plugins 中,它会实例化并正确运行。但是,因为我希望它也可以与其他浏览器一起使用,所以我的偏好是在 HKLM\Software\MozillaPlugins\ 中注册它,如此处所述。所以在我的安装程序中,我创建了这些注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@alanta.com/WinVncCtl]

"ProductName"="WinVnc NPAPI 控件"

"路径"="C:\Program Files\Alanta\WinVncCtl.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@alanta.com/WinVncCtl\MimeTypes]

[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@alanta.com/WinVncCtl\MimeTypes\application/x-alanta-vnc]

"Description"="Alanta 的 VNC 服务器 NPAPI 插件"

当然,我的安装程序将 WinVncCtl.dll 文件放置在正确的位置。(我也尝试将它重命名为 npWinVnc.dll,理论上它可能需要以“np”开头,没有骰子。我还尝试了版本标签、MIME 类型等的各种组合。)

我像这样实例化它:

vncDiv.innerHTML = "<object id='vncServerControl' classid='@alanta.com/WinVncCtl' type='application/x-alanta-vnc' />";

但它似乎并没有以这种方式实例化。但是,如上所述,如果我在 object 标记中省略了 classid,而只是将文件 npWinVnc.dll 放在我的插件目录中,那么生活是美好的。

关于我的方法可能出了什么问题的任何想法?

4

2 回答 2

2

所以我无法让它按照文档所说的方式工作。但这种特殊的组合似乎是成功的:

(1) 文件名显然必须以“np”开头,所以我将其重命名为“npWinVnc.dll”,并适当调整注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@alanta.com/WinVncCtl]

"ProductName"="WinVnc NPAPI 控件"

"路径"="C:\Program Files\Alanta\npWinVnc.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@alanta.com/WinVncCtl\MimeTypes]

[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@alanta.com/WinVncCtl\MimeTypes\application/x-alanta-vnc]

"Description"="Alanta 的 VNC 服务器 NPAPI 插件"

我知道插件目录中的文件需要以“np”开头,但显然直接注册的文件也必须以“np”开头。对我来说,这似乎是一个古怪的(和无证的!)要求,但显然就是这样。

(2) 如果你在 <object> 标签中指定了 ClassId(即使你还指定了 MIME 类型),它似乎不起作用,所以你需要指定一个 MIME 类型,如下所示:

vncDiv.innerHTML = "<object id='vncServerControl' type='application/x-alanta-vnc' />";

这种特殊的组合让它对我有用。我也更喜欢使用 ClassID,因为它可以消除插件目录中的 DLL 和安装程序放置的 DLL 之间的歧义,但这并不重要。不过,我仍然愿意接受有关 ClassId 为什么不起作用的建议。(我尝试查看 Mozilla 源代码,但决定最好将我的时间花在 nsObjectFrame.cpp 的第 1000 行附近:-(.)

于 2010-09-15T21:43:32.883 回答
2

对于您正在做的事情,您可能还想至少查看一下 FireBreath 源代码;那里有很多很好的例子,框架本身很棒(坦白:我写的)。但是,它是开源的,您可以随意使用它。

http://firebreath.org

于 2010-10-26T15:25:22.627 回答