gpt4 book ai didi

c++ - 对于具有线程模型两者的对象,COM 编码是否(永远)是必需的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:15 27 4
gpt4 key购买 nike

这是由 another question 触发的.

具体来说,我有一个进程中的 COM 类,它在 CLSID registry 中定义。因为有 ThreadingModel of Both .

我们的流程通过CoCreateInstance激活这个对象(不是 CoCreateInstanceEx,如果这对进程内 dll 服务器很重要的话)

给定一个Both的线程模型和docs中列出的规则:

Threading model of server | Apartment server is run in
------------------------------------------------------
Both | Same apartment as client

并给出 Hans 在另一个答案中写的内容:

... Marshaling occurs when the client call needs to be made on a different thread. ... can happen when the ThreadingModel specified in the comClass element demands it. In other words, when the COM object was created on one thread but is called on another and the server is not thread-safe.

我的初步结论是,这样的对象永远不需要对其接口(interface)的调用进行隐式编码,因为该对象将始终与其客户住在同一个公寓中。

这是正确的吗,即使客户端进程运行为 STA

最佳答案

是的,可能有编码(marshal)处理。

如果您的 COM 类的客户端在 STA 中运行并且您尝试从另一个单元调用您的类,则它必须编码到创建它的单元。

COM 术语确实令人困惑。在这种情况下,当您提到“客户端”时,您实际上是指一个线程,而不是整个应用程序(正如它暗示的那样)。

Both 只是意味着服务器的线程模型符合实例化它的客户端。也就是说,当您实例化您的类时,它采用创建它的线程的线程模型。由于您在 STA 中实例化服务器,因此您的服务器将使用 STA,这意味着它只能在创建它的线程上调用;如果另一个线程试图调用它,它将编码到创建它的线程。

关于c++ - 对于具有线程模型两者的对象,COM 编码是否(永远)是必需的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19847555/

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