zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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

组件线程 模型 注意 com 特别
2023-09-14 09:10:45 时间

一个常见问题

一般当我们希望调用一个对象的方法时,我们通常会首先创建这个对象。
但是,当我们开始使用一个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?》