COM之套间理解之二
一、当主线程和辅助线程com库设置为COINIT_APARTMETNTHREADED时, 测试组件1设置为Single模式时,在辅助线程创建组件时,会出现死锁,此时辅助线程死锁的堆栈如下。
ntdll.dll!_KiFastSystemCallRet@0()
user32.dll!_NtUserMessageCall@28() + 0xc 字节
user32.dll!_SendMessageW@16() + 0x49 字节
ole32.dll!CDllHost::GetApartmentToken() + 0x400c5 字节
ole32.dll!DoSTApartmentCreate() + 0x12 字节
ole32.dll!CClassCache::GetActivatorFromDllHost() + 0x39821 字节
ole32.dll!CClassCache::GetOrCreateApartment() + 0x20 字节
ole32.dll!FindOrCreateApartment() + 0x46 字节
ole32.dll!CProcessActivator::GetApartmentActivator() + 0x89 字节
ole32.dll!CProcessActivator::CCICallback() + 0x17 字节
ole32.dll!CProcessActivator::AttemptActivation() + 0x2c 字节
ole32.dll!CProcessActivator::ActivateByContext() + 0x46 字节
ole32.dll!CProcessActivator::CreateInstance() + 0x49 字节
ole32.dll!ActivationPropertiesIn::DelegateCreateInstance() + 0x4b 字节
ole32.dll!CClientContextActivator::CreateInstance() + 0x8f 字节
ole32.dll!ActivationPropertiesIn::DelegateCreateInstance() + 0x4b 字节
ole32.dll!ICoCreateInstanceEx() + 0x2d332 字节
ole32.dll!CComActivator::DoCreateInstance() + 0x28 字节
ole32.dll!_CoCreateInstanceEx@24() + 0x1e 字节
ole32.dll!_CoCreateInstance@20() + 0x34 字节
> SingleApartment.exe!ThreadProc(void * lpv=0x00af5d90) 行89 + 0x1a 字节 C++
kernel32.dll!_BaseThreadStart@8() + 0x37 字节
推断:对于加载模式为Single的组件,如果所在的线程com库不初始化COINIT_MULTITTHREDED,不会在自己的线程中执行接口及方法,会在第一个初始化COM库的线程中执行(如果这个线程第一次初始化COM库那么在这个线程中执行)。
如果所在的线程com库初始化COINIT_MULTITTHREDED,那么会在创建的另外的线程执行接口的方法函数。
对于模式为Apartment的组件,会在自己的线程的执行组件的接口和方法。当然如果把com库初始化COINIT_MULTITHTHREADED那就会在创建的另外的线程中执行接口和方法。
也就是说不管组件为Single或是Apartment模式,如果组件所在的线程将com库初始化COINIT_MULTITHREADED模式,执行组件接口和方法都将在com库创建的线程中执行。
COM之套间理解之二相关推荐
- faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)
转载自:faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data) - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.n ...
- AQS理解之二,自己设计一个锁
AQS理解之二,自己设计一个锁 一,实现锁的条件 首先我们想一想,如果我们自己实现一个类似于java中的锁,我们可能需要哪些必要的东西: 1,记录是哪个线程持有了锁. 2,如果有一个变量代表加锁,A线 ...
- 设计模式理解(二)创建型——单例、原型
设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局 ...
- Docker的一些理解(二)
Docker的一些理解(二) 百度百科 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上 ...
- 本质安全设备标准(IEC60079-11)的理解(二)
本质安全设备标准(IEC60079-11)的理解(二) 十,本安设备的测试 我们知道如何测试本安设备以及一些基本概念后, 现在需要进一步说明: (1),本安设备的测试和一般软件,硬件的测试是完全不同的 ...
- SVPWM算法理解(二)——关于非零基本矢量幅值和线电压幅值的解释
SVPWM算法理解(二)--关于非零基本矢量幅值和线电压幅值的解释 1 引言 2 非零基本矢量的幅值 3 线电压的幅值 4 电压空间矢量图中的图形含义 5 如何保证逆变器的输出电压不失真 1 引言 ...
- DFT - 对芯片测试的理解(二) 详解
DFT - 对芯片测试的理解(二) 详解 参考: https://www.docin.com/p-2014360649.html The basic view of DFT scan chain 这图 ...
- 通信系统中对眼图的理解(二)
中文名称: 眼图 英文名称: eye diagram;eye pattern 定义: 示波器屏幕上所显示的数字通信符号,由许多波形部分重叠形成,其形状类似"眼"的图形." ...
- 对CAS机制的理解(二)
一.Java当中CAS的底层实现 首先看看AtomicInteger的源码,AtomicInteger中常用的自增方法 incrementAndGet: public final int increm ...
最新文章
- 英特尔Intel® Arria® 10 FPGA加速器设计
- 证明矩阵添加一列(行),则其秩或不变,或增加1
- 在腾讯,我的试用期总结!
- 【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )
- 微信多开txt_在电脑上怎么实现微信多开的效果
- 百度地图 绘制运动轨迹_百度地图创新破局:声音个性表达、出行精准预估与全球无碍...
- 燕十八的php教材学完能找工作吗,燕十八的布尔教育怎么样? - php完全自学手册...
- Python问题解决6:使用jupyter notebook时安装第三方库提示升级pip,pip升级不成功一直报错
- mysql存储图片特征向量_图像特征提取之(一)HOG特征
- 独孤求败--之--MySQL索引存储结构(5种)
- ALG:应用层网关(防火墙)
- PhpStorm 2019 for mac(PHP集成开发工具) 2019.1.3中文激活版
- php惠新宸框架,首位国人惠新宸加入PHP官方开发组
- 数字信号处理公式变程序(四)——巴特沃斯滤波器(下)
- 三极管构成的电流负反馈放大器
- 知乎高赞的7个顶级资源网站,记住了帮你减少一半的搜索时间
- 脑图神器 XMind ZEN
- firefox os资源
- pip 查看可安装版本
- C语言中void*详解及应用
热门文章
- 关于elementUI,dialog中使用无限滚动失效的原因
- R语言-read.table读CSV文件数据
- 机器学习——贝叶斯算法(Bayes)
- Jetson Xavier NX USB-TTL串口使用
- JAVA抽象类空指针异常_[ Coding七十二绝技 ] 如何利用Java异常快速分析源码
- 基于scrapy的qq音乐爬虫
- 编码规约之命名风格(阿里规约整理,后续不再赘述)
- 微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.3 延迟队列 51.3.1 延迟队列 51.3.2 延迟队列插件
- 1分钟了解图片压缩格式 AVIF
- 告别findView和ButterKnife