大家都知道程序中若要使用COM组件则必须要先调用CoInitialize,该函数主要是用来初始化COM运行环境。但这个函数的作用域是以线程为单位还是以进程为单位呢?也许大家已经通过测试程序摸索出答案,没错,是以线程为单位。今天我们就稍微再深入一下,通过分析CoInitialize的具体实现来印证我们的想法。
我们先来看看CoInitialize的汇编
769B2A24 mov edi, edi
769B2A26 push ebp
769B2A27 mov ebp, esp
769B2A29 push 2 ; dwCoInit
769B2A2B push [ebp+8] ; pvReserved
769B2A2E call _CoInitializeEx@8 ; CoInitializeEx(x,x)
769B2A33 pop ebp
769B2A34 retn 4
可以看到,其中的实现还是比较简单的,它只是简单地调用了CoInitializeEx,将第二个参数设置为2,即COINIT_APARTMENTTHREADED。我们再来看看CoInitializeEx的实现
769AEF5B mov edi, edi
769AEF5D push ebp
769AEF5E mov ebp, esp
769AEF60 push ecx
769AEF61 push ebx
769AEF62 mov ebx, [ebp+0C]
769AEF65 mov eax, ebx
769AEF67 and eax, 0Eh ; 检查参数是否正确,目前第二个参数只用了一个字节
769AEF6A cmp eax, ebx
769AEF6C jnz loc_76A0B8C7
769AEF72 push edi
769AEF73 xor edi, edi
769AEF75 cmp [ebp+8], edi ; 判断第一个参数是否为NULL
769AEF78 jnz loc_76A0B8D1
769AEF7E
769AEF7Eloc_769AEF7E:
769AEF7E call ?IsRunningInRPCSS@@YGHXZ ;IsRunningInRPCSS(void)
769AEF83 test eax,