COM之套间的理解

对于从事com组件开发的工程师来说,寓所的概念是比较难理解的,微软对这方面的解释又很少,我将在以后的时间里,对寓所的概念给出解释。 

一、com库初始化过程调用堆栈

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)堆栈

user32.dll!_CreateWindowExW@48()  + 0x1c 字节 
  ole32.dll!InitMainThreadWnd()  + 0x3c 字节 
  ole32.dll!wCoInitializeEx()  + 0x2fd99 字节 
  ole32.dll!_CoInitializeEx@8()  + 0xc6 字节 
  SingleApartment.exe!main(int argc=1, char * * argv=0x003d39c0)  行172 + 0xc 字节 C++
  SingleApartment.exe!__tmainCRTStartup()  行318 + 0x19 字节 C
  SingleApartment.exe!mainCRTStartup()  行187 C
  kernel32.dll!_BaseProcessStart@4()  + 0x23 字节 

对于CoInitializeEx(NULL, COINIT_COINIT_MULTITHREADED)没有调用下面的堆栈

user32.dll!_CreateWindowExW@48()  + 0x1c 字节 
  ole32.dll!InitMainThreadWnd()  + 0x3c 字节 

二、com组件创建过程

对于CoInitializeEx(NULL, COINIT_MULTITHREADED)初始化的线程创建组件时的堆栈
> ole32.dll!CServerContextActivator::CreateInstance()  + 0x2b5 字节 
  ole32.dll!ActivationPropertiesIn::DelegateCreateInstance()  + 0x4b 字节 
  ole32.dll!CApartmentActivator::CreateInstance()  + 0x72 字节 
  rpcrt4.dll!_Invoke@12()  + 0x30 字节 
  rpcrt4.dll!_NdrStubCall2@16()  + 0x215 字节 
  rpcrt4.dll!_CStdStubBuffer_Invoke@12()  + 0x82 字节 
  ole32.dll!SyncStubInvoke()  + 0x33 字节 
  ole32.dll!StubInvoke()  + 0x73 字节 
  ole32.dll!CCtxComChnl::ContextInvoke()  + 0xd2 字节 
  ole32.dll!MTAInvoke()  + 0x1a 字节 
  ole32.dll!STAInvoke()  + 0x4e 字节 
  ole32.dll!AppInvoke()  + 0x3a0 字节 
  ole32.dll!ComInvokeWithLockAndIPID()  + 0x23d 字节 
  ole32.dll!ComInvoke()  + 0x5a 字节 
  ole32.dll!ThreadDispatch()  + 0x1a 字节 
  ole32.dll!ThreadWndProc()  + 0x93 字节 
  user32.dll!_InternalCallWinProc@20()  + 0x28 字节 
  user32.dll!_UserCallWinProcCheckWow@32()  + 0xb7 字节 
  user32.dll!_DispatchMessageWorker@8()  + 0xdc 字节 
  user32.dll!_DispatchMessageW@4()  + 0xf 字节 
  ole32.dll!CDllHost::STAWorkerLoop()  + 0x6b 字节 
  ole32.dll!CDllHost::WorkerThread()  + 0xc4 字节 
  ole32.dll!DLLHostThreadEntry()  + 0xd 字节 
  ole32.dll!CRpcThread::WorkerLoop()  + 0x1e 字节 
  ole32.dll!CRpcThreadCache::RpcWorkerThreadEntry()  + 0x1b 字节 
  kernel32.dll!_BaseThreadStart@8()  + 0x37 字节 


对于CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)初始化的线程创建组件时的堆栈
> ole32.dll!CServerContextActivator::CreateInstance()  + 0x2b5 字节 
  ole32.dll!ActivationPropertiesIn::DelegateCreateInstance()  + 0x4b 字节 
  ole32.dll!CApartmentActivator::CreateInstance()  + 0x72 字节 
  ole32.dll!CProcessActivator::CCICallback()  + 0x3d 字节 
  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!main(int argc=1, char * * argv=0x003d3a78)  行187 + 0x1a 字节 C++
  SingleApartment.exe!__tmainCRTStartup()  行318 + 0x19 字节 C
  SingleApartment.exe!mainCRTStartup()  行187 C
  kernel32.dll!_BaseProcessStart@4()  + 0x23 字节 

 三、对于com组件创建时的线程情况

对于CoInitializeEx(NULL,COINIT_MULTITHREADED)创建线程情况

创建组件后,除主线程外还创建了三个线程。

> 3836 __tmainCRTStartup main 正常 0
  3080 ThreadStartRoutine _KiFastSystemCallRet@0 正常 0
  2576 CRpcThreadCache::RpcWorkerThreadEntry _KiFastSystemCallRet@0 正常 0
  1188 CRpcThreadCache::RpcWorkerThreadEntry _KiFastSystemCallRet@0 正常 0
主线程创建一个辅助线程后,在辅助线程中创建组件时的线程

  3836 __tmainCRTStartup ApartMentMsgWaitForMultipleObject 正常 0
  3080 ThreadStartRoutine _KiFastSystemCallRet@0 正常 0
  2576 CRpcThreadCache::RpcWorkerThreadEntry _KiFastSystemCallRet@0 正常 0
  1188 CRpcThreadCache::RpcWorkerThreadEntry _KiFastSystemCallRet@0 正常 0
> 2372 ThreadProc ThreadProc 正常 0
通过设置断点可以发现初始com库时为COINIT_MULTITHREADED时,访问组件接口实际上是切换到1188 CRpcThreadCache::RpcWorkerThreadEntry 这个线程执行的。

当释放完组件com库后,还是存在三个线程。

> 2536 __tmainCRTStartup main 正常 0
  3496 ThreadStartRoutine _KiFastSystemCallRet@0 正常 0
  2272 CRpcThreadCache::RpcWorkerThreadEntry _KiFastSystemCallRet@0 正常 0

 


对于CoInitializeEx(NULL,COINIT_APARTMENTTHREADED)创建线程情况

没有创建任何线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值