代码之家  ›  专栏  ›  技术社区  ›  Ken Smith

无法获取列在hklm\software\mozillaplugins\中的NPAPI插件进行实例化

  •  1
  • Ken Smith  · 技术社区  · 14 年前

    我已经写了一个NPAPI插件,如果我把它放在%programfiles\mozilla firefox\plugins中,它就会正确地实例化并运行。但是,由于我希望它也能与其他浏览器一起使用,我的首选是在hklm\software\mozillaplugins\中注册它,如前所述。 here . 因此,在我的安装程序中,我创建了以下注册表项:

    [hkey_local_machine\software\mozillaplugins\@alanta.com/winvncctl]

    “ProductName”=“WinVNC NPAPI控件”

    “path”=“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放在plugins目录中,那么生活就是美好的。

    我的方法有什么问题吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Ken Smith    14 年前

    所以我没能让它像医生说的那样工作。但这种特殊的组合似乎是成功的:

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

    [hkey_local_machine\software\mozillaplugins\@alanta.com/winvncctl]

    “ProductName”=“WinVNC NPAPI控件”

    “path”=“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行附近的某个地方:-()。

        2
  •  2
  •   taxilian    14 年前

    对于您正在做的事情,您可能还希望至少看看FireBreath源代码;这里有很多好的例子,框架本身就是很好的(忏悔:我写的)。但是,它是开放源码的,您可以随心所欲地使用它。

    http://firebreath.org