首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

请特别注意COM组件的线程模型

一个常见问题

一般当我们希望调用一个对象的方法时,我们通常会首先创建这个对象。

但是,当我们开始使用一个COM对象时,好像不知道怎么创建它。

COM对象的创建由类工厂负责,并且为IMarshal获取了QueryInterface,然后就没有然后了。这是咋回事?

解释如下

这是一个明确信号:表明此COM对象没有正确地注册CLSID,很有可能是:你忘记正确设置COM对象的线程模型了。而且,如果你根本无法指定线程模型,那么你将得到默认的和可怕的主线程模型。

如果有人试图从与COM对象的线程模型不兼容的线程中创建COM对象,则系统底层会启动一堆和列集(Marshalling)相关的组件。如果没有列集组件运行,则COM库将无法使用你的对象。

MSDN上有一篇很长且非常技术性的文章,涉及COM线程模型,其中包含许多看上去很吓人的图表。

特别是在”进程内服务器:(几乎)完全依赖于它们的客户端”这一章中,有一张表列出了线程模型与对象线程模型的所有组合,以及COM在每种情况下会尝试执行的操作。

特别要注意的是,如果你有一个(错误标记地)主线程COM对象,并且除主线程之外的任何线程上有人尝试创建它,则列集组件会开始在后台工作。

因此,请特别注意COM对象的线程模型。如果不小心弄错它们,那么就会出现各种意想不到的错误。

总结

曾经有一段时间,我也赶时髦研究了一下COM有关的东西。

然后,就没有然后了。真是实力劝退啊。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《Why do I get a QueryInterface(IID_IMarshal) and then nothing?》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201217A0HHD200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券