我有一个媒体应用程序(用Delphi 2010编写,但我不确定它是否完全相关),它只允许一个实例(通过互斥锁)。
我的一个客户希望通过复制其安装及其所有应用程序数据来运行该应用程序的2个实例,因为这将允许他将输出运行到两个不同的声卡,给他两个音频区域。
现在我可以通过命令行开关允许第二个实例,从而创建一个不同名称的互斥锁,甚至允许他通过命令行开关或窗口消息传递将控件发送到应用程序的任一个实例。
我的应用程序还公开了一个用于自动化目的的COM接口,显然这提供了比命令行更丰富的接口,并且更容易从应用程序中获取信息。
所以我的问题是,据我所知,我只能将COM接口暴露给一个可执行文件。现在我知道这是有道理的,但我想知道是否有人能想到解决方法。
我快速尝试复制我的HKLM \ Software \ Classes \ AppID的注册表项,从而制作了AppIDv2并获得了我的应用程序的另一个副本,但我想这一切都是在它打到TypeLib等更具体的GUIDS请注意,我知道我超越了我的知识范围!
我的想法是,如果我可以创建一个不同的AppID字符串并最终针对位于不同位置的exe,那么我们至少可以通过编写COM Automation脚本来进行一些自动化,但我怀疑对GUID的要求最终是让我失望。
另一种选择可能是将我的COM移动到进程中,然后让我的应用程序的多个编译版本通过新的AppID公开主接口的实例,但是当你希望DLL知道所有关于正在运行的实例时会变得很乱你的申请。
欢迎任何想法。提前谢谢。
答案 0 :(得分:2)
听起来您想在运行对象表(ROT
)中注册自己。
我将您的问题比作运行多个Excel副本的问题。 COM有一种机制允许某人查找我正在运行的Excel实例并连接到其中一个。
进程外COM对象应该在ROT中注册。然后,来电者可以使用GetActiveObject
查找您的实例:
要自动运行已在运行的Office应用程序,可以使用GetActiveObject()API函数获取正在运行的实例的IDispatch指针。为运行的实例提供此IDispatch指针后,可以使用正在运行的实例的方法和属性。
您可能不喜欢它,但我相信解决方案是有一个应用程序接口,并且“第一个”应用程序充当应用程序的其他“实例”的网关(即您的自动化服务器)。
我不是进程外COM自动化方面的专家,但我认为我已经阅读了足以相信这是(不幸的)答案。
答案 1 :(得分:0)
确实需要运行对象表(IRunningObjectTable)。伊恩的答案基本上是正确的。
http://msdn.microsoft.com/en-us/library/ms695276(v=VS.85).aspx
但是,在ROT中可以有两个可区分的实例,允许访问您的应用程序的两个副本,因为它们的标记是有区别的。
马丁