请特别注意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?》
相关文章
- 【华为云技术分享】DAS文件上传组件的进化
- 从连接器组件看Tomcat的线程模型——NIO模式
- java中解决组件重叠的问题(例如鼠标移动组件时)
- 使用Timer组件_实现定时更改窗体颜色
- 二、Android应用的界面编程(一)界面编程与视图(View)组件
- iSlider手机平台JS滑动组件
- EasyDSS RTMP流媒体服务器web前端:vue组件之间的传值,父组件向子组件传值
- [Go] golang 替换组件包 更新 go.mod, go.sum 的方式
- elementui 分页el-pagination遇到的所有坑(current失效、分页组件不显示、视图不改变等)
- 5.3.2 jmeter组件-线程组:setUp线程组和tearDown线程组
- 常见的windows下无文件落地攻击手法——主要讨论了powershell脚本、HTA是HTML Application的缩写(HTML应用程序)、xml中利用COM组件、certutil下载然后调用Dcom组件执行恶意代码、msxsl.exe是微软用于命令行下处理XSL的可以执行JavaScript执行系统命令
- SystemVerilog学习-04-验证环境组件、任务和函数
- Vue3父子组件通讯
- 【微服务笔记09】微服务组件之Hystrix实现线程池隔离和信号量隔离
- Chapter5 ROS常用组件(Ⅱ)----rosbag&rqt工具箱