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

标签 c++ com marshalling sta apartments

这是由 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/

相关文章:

c# - 与嵌入式动态分配数组的托管/非托管类型组合无效

c# - 从 C++ 编码到 C# 时 CLR 崩溃

c++ - 在 C++17 中重载命名空间和子命名空间中的运算符是不明确的

c++ - 需要帮助格式化输出 C++

android - Eclipse CDT C/C++ 索引器未检测到几个类

Delphi 2009 COM/ActiveX 类型库支持稳定性

c++ - CGAL 4.4 安排插入(arr,曲线)与一些曲线崩溃

c# - 当接收对象是 C# COM 对象并且函数具有接口(interface)作为参数时,VBScript 抛出异常

audio - 使用MediaFoundationReader时出现COMException

c# - 从 c# LPCTSTR 编码不再工作