请特别注意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?》
- 下一篇: 说说无效的线程和进程ID
- 上一篇: 为什么RECT结构体被设计为开区间
相关推荐
- 关于注册表向后兼容的悲伤故事
- Posted on 07月01日
- Visual Studio Code新扩展出炉:CMake工具
- Posted on 11月22日
- 使用Visual Studio进行远程macOS C++开发
- Posted on 03月18日
- 第 470 期:英伟达正在调查游戏黑屏和图像异常的问题
- Posted on 02月04日



评论已关闭。