0

我正在开发一个 ActiveX,其中相同的代码库应该用于两个不同的 ActiveX,这意味着,我有一个由多个 DLL 构建的单一解决方案。当我为创建 ActiveX A 的 CAB 构建解决方案时,我将 DLL 类 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?

谢谢。

4

1 回答 1

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:调用 ActiveX 对象时“对象不支持此属性或方法”

于 2013-05-27T09:10:18.743 回答