COM之套间理解之二

19 篇文章 0 订阅

  

一、当主线程和辅助线程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库创建的线程中执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值