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