Mar*_* Ba 4 c++ com apartments marshalling sta
这是由另一个问题引发的.
具体地讲,我有一个在过程COM类中,在所定义的CLSID注册表为具有ThreadingModel的Both.
我们的进程激活了这个对象CoCreateInstance(不是 CoCreateInstanceEx,如果这对于进程内DLL服务器来说很重要)
给Both定文档中列出的规则的线程模型和给定规则:
Threading model of server | Apartment server is run in
------------------------------------------------------
Both | Same apartment as client
Run Code Online (Sandbox Code Playgroud)
鉴于汉斯在另一个答案中所写的内容:
...当需要在不同的线程上进行客户端调用时,就会发生编组....当comClass元素中指定的ThreadingModel需要它时,可能会发生.换句话说,当COM对象在一个线程上创建但在另一个线程上调用时,服务器不是线程安全的.
我的初步结论是,这样的对象永远不需要对其接口的调用进行隐式编组,因为该对象将始终与其客户端位于同一个公寓中.
这是正确的,即使客户端进程作为STA运行?
是的,可能有编组.
如果您的COM类的客户端在STA中运行并且您尝试从另一个公寓调用您的类,则它将必须编组到创建它的公寓.
COM术语可能真的令人困惑.当你在这种情况下引用'客户'时,你实际上指的是一个线程,而不是整个应用程序(正如它所暗示的那样).
Both只是意味着服务器的线程模型符合实例化它的客户端.也就是说,当您实例化类时,它会采用创建它的线程的线程模型.由于您在STA中实例化服务器,您的服务器将使用STA,这意味着它只能在创建它的线程上调用; 如果另一个线程试图调用它,它将封送它创建的线程.