如何为Chrome、Firefox、Safari开发(NPAPI)COM插件

如何为Chrome、Firefox、Safari开发(NPAPI)COM插件,com,npapi,browser-plugin,Com,Npapi,Browser Plugin,在我的遗留web应用程序中,我需要从JS中读取用户系统注册表并执行其他一些操作。出于安全原因,我不能使用ActiveX,因此我编写了一个插件。我的插件由一个DLL文件组成,它是一个COM组件。这个COM组件公开了我从Java脚本代码调用的几个函数 在IE中,我将我的DLL打包到CAB文件中,并按照以下方式安装它,比如说它是test.DLL: <object classid="clsid:some class id here" codebase="test.cab" height="0" w

在我的遗留web应用程序中,我需要从JS中读取用户系统注册表并执行其他一些操作。出于安全原因,我不能使用ActiveX,因此我编写了一个插件。我的插件由一个DLL文件组成,它是一个COM组件。这个COM组件公开了我从Java脚本代码调用的几个函数

在IE中,我将我的DLL打包到CAB文件中,并按照以下方式安装它,比如说它是test.DLL:

<object classid="clsid:some class id here" codebase="test.cab" height="0" width="0" onError="testInstalled=false; return true;" id="testComp"></object>
它在IE中运行良好。我需要在其他浏览器(Chrome、Firefox、Safari)中使用相同的功能

你能建议如何使用我的DLL文件为其他浏览器开发插件吗


谢谢,

我不明白:首先你说“出于安全原因,我不能使用ActiveX”,然后你做了与ActiveX一样的坏事,尽管ActiveX有着危险的优点:一个CAB打包的COM对象运行不受限制的本机Win32

这样做如何解决ActiveX的安全问题

暂且不谈“安全性”的问题:如果您还没有开始使用“ActiveX”,那么您已经非常接近了。我不记得我头脑中的所有细节是什么[IE插件体系结构,它与其他东西共享市场上的绰号]“ActiveX”,但我认为你所缺少的被称为“ActiveX”的只是一些你必须实现的接口。我还怀疑,由于害怕“ActiveX”,您甚至无法使用Authenticode在CAB上签名,这将为您的用户提供一点信心(假设您保持适当的控件和密钥管理,并且您的用户足够信任您,允许您的本机代码在其计算机上运行)

在任何情况下,您编写的DLL都只能在IE中运行。没有其他浏览器支持Win32本机COM对象(无论您是否严格遵循ActiveX规范)。如果你想在其他浏览器中做同样的事情,你必须用其他东西重写它

我认为你(最多)有两种选择来做你想做的事:

  • COM/ActiveX:COM对象中的本机Win32代码。你现在在做什么。这只适用于IE,对用户来说是极其危险的,除非它是在受控环境中进行的(例如,如果这是一个由企业客户的it部门分发的商业产品,或者如果你像一些大公司一样拥有知名度和声誉)

  • Java:。这将在所有浏览器上运行,前提是您的用户安装并启用了正确的运行时。但是,只有当Java允许通过沙盒授权的方法访问您寻求的信息时,它才对您有效,因为您不能从Java沙盒调用注册表API。这同样适用于需要插件完成的“其他工作”

好的,那么你有第三个选择:

  • 在与浏览器无关的东西中重新实现整个功能:原生Windows可执行文件;可能是在可下载的安装程序中,也可能是通过ClickOnce部署的.NET程序中
你陷入了困境:你说的是“我对运行ActiveX有安全顾虑,但我需要做一些危险的事情”任何可通过web浏览器下载并运行的、能够直接访问注册表的代码都必然是一段危险的代码。任何允许您从浏览器运行此类代码的技术都会立即引发ActiveX引发的安全问题


在现代浏览器沙盒环境中,不分青红皂白地访问注册表是不可能的,因此您必须为所需的特定信息找到不同的源,或者必须使用在IE下运行的ActiveX/COM。

谢谢您的回复。我的Cab文件经过了愚蠢的签名和认证。你的第三点:“用与浏览器无关的东西重新实现整个过程:一个本机Windows可执行文件;可能是一个可下载的安装程序,也可能是一个通过ClickOnce部署的.NET程序。”你能详细说明一下这一点吗,如果可能的话,举个例子吗?这种方法似乎更好,也可以在不同的浏览器中实现。如果我创建一个MSI安装程序,它将在不同的浏览器中安装我的DLL?这种方法有效吗?@AsadRaza没有“浏览器插件/扩展标准”。那么,“在不同的浏览器中安装我的DLL”是什么意思?@manuell,我有一个COM DLL,它可以执行一些任务,如读取注册表等。我需要在浏览器中安装这个DLL作为插件,以便可以从Java脚本代码中使用它。在IE中,我可以简单地将我的DLL打包到CAB文件中,并通过标记安装它。但是如何在其他浏览器中实现安装呢?如果我创建了一个MSI安装程序,将我的DLL作为插件安装,这在所有浏览器中都有效吗?在询问安装/打包之前,先测试一下浏览器中的标记,以及JS如何调用你的DLL。然后,/如果它有效,您可以查看安装问题。建议:考虑使用java,而不是。@ Georg Fritzsche,是的,类似的
var testCompApp = document.testComp;
testCompApp.callSomeFunction();