gpt4 book ai didi

com - 在它自己的 exe 容器中创建每个 COM 实例

转载 作者:行者123 更新时间:2023-12-01 22:45:41 26 4
gpt4 key购买 nike

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

我猜需要一些背景知识。

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

不过,我现在应该制作一个“客户端模拟器”来测试服务器端。因此,我创建了 20 个客户端组件的实例。如果我可以让每个实例在其自己的 exe 主机中实例化,那么单例问题就会得到处理。

问候雷夫

最佳答案

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

在 ATL 模块中,重写 RegisterClassObjects() 函数,如下所示:

HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
{
return base::RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SUSPENDED | REGCLS_SINGLEUSE);
}

来自关于 REGCLS_SINGLEUSE 的 MSDN:

REGCLS_SINGLEUSE

After an application is connected to a class object with CoGetClassObject, the class object is removed from public view so that no other applications can connect to it. This value is commonly used for single document interface (SDI) applications. Specifying this value does not affect the responsibility of the object application to call CoRevokeClassObject; it must always call CoRevokeClassObject when it is finished with an object class.

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

关于com - 在它自己的 exe 容器中创建每个 COM 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1287280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com