【发布时间】: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 对象客户端都是可见的。