注册和使用ActiveX/COM组件,该组件是使用运行时生成的UUID通过IDL创建的

Registering and using an ActiveX / COM component that is created with an IDL with the UUIDs generated at runtime

本文关键字:组件 通过 创建 IDL 运行时 UUID ActiveX COM 注册      更新时间:2023-10-16

我有一个现有的ActiveX/COM组件,它已经运行了一段时间。这个ActiveX组件最初设计为每台机器一个客户端应用程序使用。然而,现在需要扩展这个ActiveX组件,以便在同一台PC中由一个以上的客户端应用程序使用。

我知道COM之所以存在,是因为它的可重用性,而且有一些方法可以管理它,比如引用计数等。但我的问题不同。请阅读…

我的每个客户端应用程序都是不同的,这些客户端应用程序充当独立的应用程序——从某种意义上说,它们是作为单独的应用程序安装和卸载的。它们各自携带一个ActiveX组件的副本,并将其安装在自己的安装目录中。每个客户端应用程序都有自己的ActiveX组件副本,可以安装、使用和卸载。

以下是基本发生的步骤。下面的第4步是实际问题:

  1. 第一次安装客户端应用程序X时,由于它使用COM,安装程序会注册COM组件,并在注册表中创建一个条目,即"typelib"条目,该条目具有IDL和.rgs.中定义的UUID

  2. 若我安装另一个客户端应用程序Y,在卸载客户端应用程序X之前,Y的安装程序会用Y当前目录中ActiveX组件的路径更新"typelib"的"win32"值。

  3. 当我卸载客户端应用程序X时,它会从注册表中删除这个typelib条目。

  4. 因此,在这一点上,如果我试图卸载应用程序Y,它会失败,因为缺少typelib条目。X的卸载程序已删除此条目。

为了解决这个问题,我正在尝试绕过使用类型库,或者使用其他方式(如果可能的话)来使用ActiveX组件,而不会出现我现在面临的问题。

问题归结为:对于不同的客户端应用程序,但对于相同的ActiveX组件,使用不同的类型库条目。

有人能指导我并提出一个好的、优雅的解决方案吗?

我通过修改rgs文件创建IDL解决了这个问题。