无法获取HKLM \ Software \ MozillaPlugins \中列出的NPAPI插件进行实例化

时间:2010-09-14 23:36:18

标签: installation npapi

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

  

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

     

“ProductName”=“WinVnc NPAPI Control”

     

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

     

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

     

[HKEY_LOCAL_MACHINE \ SOFTWARE \ MozillaPlugins \ @ alanta.com / WinVncCtl \ MIMETYPES \应用程序/ 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' />";

但它似乎没有实例化。但是,如上所述,如果我在对象标记中省略了classid,只需将文件npWinVnc.dll放在我的插件目录中,生活就会很好。

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

2 个答案:

答案 0 :(得分:2)

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

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

  

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

     

“ProductName”=“WinVnc NPAPI Control”

     

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

     

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

     

[HKEY_LOCAL_MACHINE \ SOFTWARE \ MozillaPlugins \ @ alanta.com / WinVncCtl \ MIMETYPES \应用程序/ x-alanta-VNC]

     

“Description”=“Alanta的VNC服务器NPAPI插件”

我知道插件目录中的文件需要以“np”开头,但显然直接注册的文件也必须以“np”开头。这对我来说似乎是一个棘手的(并且没有记录!)要求,但它显然是这样的。

(2)如果在&lt; object&gt;中指定ClassId tag(即使你也指定了MIME类型),它似乎不起作用,所以你需要JUST指定一个MIME类型,如下所示:

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

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

答案 1 :(得分:2)

对于您正在做的事情,您可能还想至少查看FireBreath源代码;那里有很多很好的例子,框架本身很好(忏悔:我写了)。但是,它是开源的,您可以根据需要使用它。

http://firebreath.org