当进程内 COM 服务器注册时,HKCR\CLSID\ClassId\InprocServer32
下通常应该有一个 ThreadingModel
值来控制类对象的使用方式在多线程环境中。看起来进程外服务器不需要此值。我搜索并发现了很多示例,其中 HKCR\CLSID\ClassId\LocalServer32
下有 ThreadingModel
值,还有 this article这说明不需要这个值,但我不太确定我是否理解那里的推理。
我还搜索了我机器上的注册表,发现很多类大多由 Microsoft 提供,其中 ThreadingModel
也在 InProcServer32
下指定。
ThreadingModel
是否会对进程外服务器产生任何影响,或者我是否可以始终忽略它?
最佳答案
您不需要 LocalServer32 的 ThreadingModel,因为无论您做什么,COM 总是会在客户端和服务器之间为 .exe COM 服务器创建代理,因为进程间调用需要代理。所以对于客户端来说,服务器是在 STA 中还是在 MTA 中并不重要。
文章的重点是,对于进程内服务器,COM 将尝试根据调用者的单元和 InProcServer32 中的 ThreadingModel 来决定最好使用哪个单元,而对于外进程服务器,调用者并不关心单元,所以通过从注册表中省略 ThreadingModel,COM 服务器的开发人员可以通过他/她的类工厂实现来决定使用哪个单元。
关于windows - 注册进程外 COM 服务器时是否需要指定 "ThreadingModel"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5815310/