ActiveX注册

时间:2012-07-05 07:20:46

标签: activex

我正在开发一个ActiveX,其中相同的代码库应该用于两个不同的ActiveX,这意味着,我有一个由多个DLL构建的单一解决方案。 当我构建用于为ActiveX A创建CAB的解决方案时,我将DLL类ID更改为特定的ID,当我构建它以创建第二个ActiveX的CAB时,我将类ID更改为其他内容。

我需要两个ActiveX才能在同一台机器上运行。 基本上,它工作正常,除了在我运行不同版本的ActiveX(ActiveX A来自旧代码版本而不是ActiveX B)的某些场景中,存在不期望的行为。 看起来ActiveX从ActiveX B加载了一些DLL(来自不同的代码版本)。

很抱歉有很长的描述,但是最后一些重要的信息,因为两个ActiveX来自相同的代码,我有相同的类名,它暴露给调用ActiveX的javascript。 在注册表中,除以下内容外,所有键都有完全分隔(NetworkInterface是公开的类):

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyActiveX.NetworkInterface\CLSID]
@="{31ED2205-F6AE-4133-AD30-60CA2783ADA6}"

安装ActiveX时,我看到此条目具有正确的类ID,但在安装第二个ActiveX时,第二个ActiveX会覆盖该键。

有可能实现我想要实现的目标吗? 有没有办法让同一个类注册不同的类ID?

感谢。

1 个答案:

答案 0 :(得分:0)

@Lior,你在这句话中自己回答了你的问题:“让同一个班级注册不同的班级ID”。事实上,我们正在谈论ProgID或程序化标识符 - 您的案例中的MyActiveX.NetworkInterface。

ProgID只有一个专用的注册表配置单元 - HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \,如果在客户端代码中使用ProgID来实例化组件,则只能为一个ActiveX组件执行此操作。使用ProgID创建实例时,使用该注册表配置单元确定相应的CLSID,并使用实现该类的可执行DLL / OCX / EXE。对于后一种情况,相应的注册表配置单元如下所示:

HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID {6935DB93-21E8-4ccc-BEB9-9FE3C77A297A} \ InProcServer32中

在这种情况下可以做的最好的事情是为两个ActiveX组件使用两个不同的ProgID。即使您对主类使用相同的源代码,也可以在两个不同的项目中“按原样”使用它们,这些项目用于使用单独的ProgID编译组件。看起来,所有开发环境(你可能使用的VB6)都允许你这样做。

有关此内容的更多信息,请参阅此文章:http://www.vbaccelerator.com/progid.htm

我们的ActiveX组件遇到了同样的问题,我们的经验告诉我们,拥有不同的ProgID是最佳选择。即使您发布下一个版本,也请更改ProgID。这将允许两个版本在同一个操作系统中共存而没有任何问题,开发人员可以逐步升级现有项目。

===

作为您问题的答案,我知道如果您无法更改ProgID,您将如何尝试解决问题。据我所知,你可以直接使用他们的CLSID激活ActiveX,不同的开发环境使用不同的技术。我没有您的项目,但如果您使用JavaScript,您可以尝试本文中的配方:

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/08652e9e-7deb-40a3-8c1a-f9becdcbf56e/

简而言之,您不需要使用以下调用来创建ActiveX对象:

myobject = new ActiveXObject("SAMPLEACTIVEX.sampleActiveXCtrl.1");

您需要使用OBJECT标记将两个ActiveX控件放在页面上,并使用网页上的名称(id)调用对象的方法。如果您查看HTML OBJECT标记的示例,您将看到如下内容:

如您所见,您可以使用指定的ID访问您确切需要的对象的成员。很多例子已经在SO上了 - 这是其中之一:

javascript: "Object doesn't support this property or method" when ActiveX object called