我编写了一个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放在我的插件目录中,生活就会很好。
关于我的方法可能出现什么问题的任何想法?
答案 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源代码;那里有很多很好的例子,框架本身很好(忏悔:我写了)。但是,它是开源的,您可以根据需要使用它。