【问题标题】:Exposing the same Auto of Process COM server from multiple copies of the same executable从同一可执行文件的多个副本中公开相同的 Auto of Process COM 服务器
【发布时间】:2011-06-15 21:07:10
【问题描述】:

我有一个媒体应用程序(用 Delphi 2010 编写,但我不确定这是否完全相关),它只允许一个实例(通过互斥体)。

我的一位客户希望通过复制其安装及其所有应用程序数据来运行该应用程序的 2 个实例,因为这将允许他将输出运行到两个不同的声卡,从而为他提供两个音频区域。

现在我可以通过命令行开关允许第二个实例,从而创建一个不同名称的互斥锁,甚至允许他通过命令行开关或 Windows 消息传递将控件发送到应用程序的任一实例。

我的应用程序还公开了一个用于自动化目的的 COM 接口,显然这提供了比命令行更丰富的接口,并且更容易从应用程序中获取信息。

所以我的问题是,据我所知,我只能将 COM 接口公开给一个可执行文件。现在我知道这是有道理的,但我想知道是否有人能想到解决方法。

我快速尝试复制我的 HKLM\Software\Classes\AppID 的注册表项,从而制作 AppIDv2 并尽可能地启动我的应用程序的另一个副本,但我想当它遇到用于 TypeLib 等的更具体的 GUIDS。请注意,我知道我超出了我的知识范围!

我的想法是,如果我可以创建一个不同的 AppID 字符串并最终以位于不同位置的 exe 为目标,那么我们至少可以通过脚本 COM 自动化进行一些自动化,但我怀疑对 GUID 的要求最终是会让我失望的。

另一种选择可能是将我的 COM 移动到进程内,然后让我的应用程序有多个编译版本,这些版本通过新的 AppID 公开主界面的一个实例,但是当您希望 DLL 了解所有关于正在运行的实例时,这会变得混乱您的应用程序。

欢迎任何想法。提前致谢。

【问题讨论】:

  • 您为什么不将 COM 移动到一个 DLL 中,该 DLL 可以拥有任意数量的实例,然后通过 TCP/IP 套接字从该 DLL 与您的主应用程序或应用程序进行通信。您的程序的所有实例对任意数量的进程内 COM 对象客户端都是可见的。

标签: delphi com


【解决方案1】:

听起来您想在Running Objects Table (ROT) 中注册自己。

我将您的问题比作运行多个 Excel 副本的问题。 COM 有一种机制允许某人找到我正在运行的 Excel 实例并连接到其中一个。

进程外 COM 对象应向 ROT 注册自己。然后调用者可以使用GetActiveObject 来查找您的实例:

要自动化已经运行的 Office 应用程序,您可以使用 GetActiveObject() API 函数来获取正在运行的实例的 IDispatch 指针。一旦获得了运行实例的 IDispatch 指针,就可以使用运行实例的方法和属性。

您可能不喜欢它,但我相信解决方案是一个应用程序接口,并且“第一个”应用程序充当您的应用程序的其他“实例”的网关(即您的自动化服务器)。

我不是进程外 COM 自动化方面的专家,但我认为我已经阅读了足够多的内容,相信这是(不幸的)答案。

另见

【讨论】:

  • 嗨,Ian,感谢您的回复,这当然让我开始了,但正如 Martyn 指出的那样,我确实需要 Monikers,以适应我的具体情况。
【解决方案2】:

您确实需要运行对象表 (IRunningObjectTable)。伊恩的回答基本正确。

http://msdn.microsoft.com/en-us/library/ms695276(v=VS.85).aspx

但是,ROT 中可能有两个可区分的实例,允许访问您应用的两个副本,因为它们的名字是可区分的。

马丁

【讨论】:

  • 感谢 Martyn,您和 Ian 都为我指明了正确的方向。你的回答更适合我的情况,因为我确实需要绰号。在我的实例中特别是 CreateItemMoniker。然后,我可以在 ROT 中将我的应用程序界面的每个副本注册为 MyApp.Zone1、MyApp.Zone2 等。然后我可以通过枚举 ROT 并解析其中的对象名称来检索区域列表,我可以检索特定的通过使用 IRunningObbjectTable.GetObject 使用由 CreateItemMoniker 再次创建的名字对象来接口。
  • ...我找不到通过脚本从 ROT 中选择实例的方法,但是我应该能够使用 MyInterface.GetZone(Zone1) 之类的东西扩展我的接口并拥有我的代码无论如何,将适当的实例从 ROT 返回到脚本。整个解决方案实际上将让我获得比我预期的更多的成就,因为它甚至允许应用程序的实例在需要时相互通信。再次感谢。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2018-03-25
相关资源
最近更新 更多