一、当主线程和辅助线程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之套间理解之二相关推荐

  1. faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)

    转载自:faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data) - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.n ...

  2. AQS理解之二,自己设计一个锁

    AQS理解之二,自己设计一个锁 一,实现锁的条件 首先我们想一想,如果我们自己实现一个类似于java中的锁,我们可能需要哪些必要的东西: 1,记录是哪个线程持有了锁. 2,如果有一个变量代表加锁,A线 ...

  3. 设计模式理解(二)创建型——单例、原型

    设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局 ...

  4. Docker的一些理解(二)

    Docker的一些理解(二) 百度百科 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上 ...

  5. 本质安全设备标准(IEC60079-11)的理解(二)

    本质安全设备标准(IEC60079-11)的理解(二) 十,本安设备的测试 我们知道如何测试本安设备以及一些基本概念后, 现在需要进一步说明: (1),本安设备的测试和一般软件,硬件的测试是完全不同的 ...

  6. SVPWM算法理解(二)——关于非零基本矢量幅值和线电压幅值的解释

    SVPWM算法理解(二)--关于非零基本矢量幅值和线电压幅值的解释 1 引言 2 非零基本矢量的幅值 3 线电压的幅值 4 电压空间矢量图中的图形含义 5 如何保证逆变器的输出电压不失真 1 引言   ...

  7. DFT - 对芯片测试的理解(二) 详解

    DFT - 对芯片测试的理解(二) 详解 参考: https://www.docin.com/p-2014360649.html The basic view of DFT scan chain 这图 ...

  8. 通信系统中对眼图的理解(二)

    中文名称: 眼图 英文名称: eye diagram;eye pattern 定义: 示波器屏幕上所显示的数字通信符号,由许多波形部分重叠形成,其形状类似"眼"的图形." ...

  9. 对CAS机制的理解(二)

    一.Java当中CAS的底层实现 首先看看AtomicInteger的源码,AtomicInteger中常用的自增方法 incrementAndGet: public final int increm ...

最新文章

  1. 英特尔Intel® Arria® 10 FPGA加速器设计
  2. 证明矩阵添加一列(行),则其秩或不变,或增加1
  3. 在腾讯,我的试用期总结!
  4. 【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )
  5. 微信多开txt_在电脑上怎么实现微信多开的效果
  6. 百度地图 绘制运动轨迹_百度地图创新破局:声音个性表达、出行精准预估与全球无碍...
  7. 燕十八的php教材学完能找工作吗,燕十八的布尔教育怎么样? - php完全自学手册...
  8. Python问题解决6:使用jupyter notebook时安装第三方库提示升级pip,pip升级不成功一直报错
  9. mysql存储图片特征向量_图像特征提取之(一)HOG特征
  10. 独孤求败--之--MySQL索引存储结构(5种)
  11. ALG:应用层网关(防火墙)
  12. PhpStorm 2019 for mac(PHP集成开发工具) 2019.1.3中文激活版
  13. php惠新宸框架,首位国人惠新宸加入PHP官方开发组
  14. 数字信号处理公式变程序(四)——巴特沃斯滤波器(下)
  15. 三极管构成的电流负反馈放大器
  16. 知乎高赞的7个顶级资源网站,记住了帮你减少一半的搜索时间
  17. 脑图神器 XMind ZEN
  18. firefox os资源
  19. pip 查看可安装版本
  20. C语言中void*详解及应用

热门文章

  1. 关于elementUI,dialog中使用无限滚动失效的原因
  2. R语言-read.table读CSV文件数据
  3. 机器学习——贝叶斯算法(Bayes)
  4. Jetson Xavier NX USB-TTL串口使用
  5. JAVA抽象类空指针异常_[ Coding七十二绝技 ] 如何利用Java异常快速分析源码
  6. 基于scrapy的qq音乐爬虫
  7. 编码规约之命名风格(阿里规约整理,后续不再赘述)
  8. 微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.3 延迟队列 51.3.1 延迟队列 51.3.2 延迟队列插件
  9. 1分钟了解图片压缩格式 AVIF
  10. 告别findView和ButterKnife