在其中创建每个COM实例';s自己的exe容器

在其中创建每个COM实例';s自己的exe容器,com,Com,是否可以在自己的专用主机进程中创建COM实例 我想需要一些背景知识 我们有一个终端用户客户端,它的中心逻辑组件位于单例COM对象中。(不是propper singleton,但它在内部使用全局变量,所以它会失败。)因此每个exe文件应该只有一个实例。方便的同时,使客户 然而,我现在应该制作一个“客户端模拟器”来测试服务器端。因此,我需要创建客户机组件的20个实例。 如果我能让每个实例在自己的exe主机中实例化,那么单例问题就会得到解决 问候 Leif我的COM时代早已过去,但据我记忆所及,没有内

是否可以在自己的专用主机进程中创建COM实例

我想需要一些背景知识

我们有一个终端用户客户端,它的中心逻辑组件位于单例COM对象中。(不是propper singleton,但它在内部使用全局变量,所以它会失败。)因此每个exe文件应该只有一个实例。方便的同时,使客户

然而,我现在应该制作一个“客户端模拟器”来测试服务器端。因此,我需要创建客户机组件的20个实例。 如果我能让每个实例在自己的exe主机中实例化,那么单例问题就会得到解决

问候
Leif

我的COM时代早已过去,但据我记忆所及,没有内置的方法可以做到这一点

重写代码以使其支持多个实例可能比使用COM执行每个实例一个进程的路由更容易,但您可以这样做:

  • 为全局变量使用线程本地存储并编写另一个CoClass,其中每个实例都拥有自己的线程,通过该线程可以封送对具有全局变量的类的访问。这至少可以避免DCOM对性能的影响

  • 编写自己的进程外exe服务器(类似于windows的DllHost.exe)以承载COM实例。这需要IPC(进程间通信),因此您要么自己编写代码以封送对外部进程的调用,要么使用DCOM(假定COM对象实现IDispatch)

提到了如何使用DLLHost作为代理进程的说明:


我自己从来没有尝试过,我也不知道是否可以为工厂指定标志(它控制代理是否可以对多个对象重复使用),但也许可以通过DCOMCNFG或OLEVIEW进行调整。

我已经为这个问题挣扎了几天。我终于找到了一个有效的解决方案。我的COM对象是使用ATL编写的,因此我的代码片段将针对这一点,但技术解决方案应该是明确的。这一切都取决于类对象的注册方式。REGCLS\u SINGLEUSE标志是关键。现在每个对象实例都有单独的进程

在ATL模块中,按如下方式重写RegisterClassObjects()函数:

HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
{
    return base::RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SUSPENDED | REGCLS_SINGLEUSE);
}
来自MSDN关于单一用途的法规:

REGCLS_SINGLEUSE

应用程序连接到具有 CoGetClassObject,类对象将从公共视图中删除,以便 没有其他应用程序可以连接到它。此值是常用的 用于单文档接口(SDI)应用程序。指定此 值不影响对象应用程序对 调用CoRevokeClassObject;在以下情况下,它必须始终调用CoRevokeClassObject 它是用一个对象类完成的


我的理论是,由于注册已从公共视图中删除,因此会为后续实例化创建一个新流程。

好提示。在使用“propper”方法之前,我希望使用更多的“魔力钥匙”。这个解决方案不会让所有实例都驻留在一个DLLHOST进程中吗?每个实例都有自己的私有进程?这就是我所说的关于类工厂的胡言乱语的意思。当工厂在进程外服务器中注册时,您可以指定是否要对CoCreateInstance进行多次响应——否则,将启动一个新服务器。看见您需要单独使用REGCLS。问题是,您是否可以向DLLHOST指定要使用的REGCLS。。。我不确定。啊,听起来很烦人。这一次我通过一个变通解决了这个问题。但是“下一次”我应该多看看这个。谢谢