windows - 注册进程外 COM 服务器时是否需要指定 "ThreadingModel"?

标签 windows com com-interop

当进程内 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/

相关文章:

c++ - Windows 10下为VTK生成Makefile时Qt mkspecs路径错误

c# - 是否可以使用 C# 与 Thunderbird 互操作?

c++ - 如何将 VARIANT_BOOL* 转换为 bool*

c# - 如何为 Visual Studio 插件编写单元测试?

c# - 如何将 COM 对象包装在 native .NET 类中?

php - 如何为 MySQL 远程数据库连接设置 Windows Server 2008?

windows - Windows 上的 SQLite DB 像互斥锁一样锁定且无需轮询

c++ - C/C++ iTunes API 在哪里? (不是 COM!)

c# - 使用 c# 捕获 COM 错误

.net - 为什么我无法在 .NET 中使用 TBIMP 创建的互操作程序集?