您的位置:首页 > 其它

COM之套间的理解

2007-12-05 17:26 399 查看
对于从事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)创建线程情况

没有创建任何线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: