CoInitialize浅析二

本文详细分析了COM环境初始化过程中wCoInitializeEx的内部实现,通过汇编代码揭示了其计数器机制、进程及线程初始化细节。重点探讨了单线程套间初始化时创建隐藏消息窗口的过程,以及如何通过消息机制实现COM组件调用的串行化,降低多线程同步需求的同时影响效率。
摘要由CSDN通过智能技术生成

最近工作比较忙,在粗略分析了CoInitialize之后我们一直没有再深入研究,下面言归正传。前面我们初步了解到了CoInitialize其实是通过调用CoInitializeEx来实现功能的,而后者最终调用了wCoInitializeEx函数,如果能进一步了解这个函数的内部实现,那么我们对COM环境的初始化过程就比较清晰了。好,我们下面继续看wCoInitializeEx的汇编代码,这次我们分段来看。

769AF092 arg_0           = dword ptr  8
769AF092 arg_4           = byte ptr  0Ch
769AF092                 mov     edi, edi
769AF094                 push    ebp
769AF095                 mov     ebp, esp
769AF097                 push    ebx
769AF098                 push    esi
769AF099                 push    edi
769AF09A                 mov     edi, ds:__imp__InterlockedIncrement@4 ; InterlockedIncrement(x)
769AF0A0                 push    offset ?g_cProcessInits@@3KA ; lpAddend
769AF0A5                 call    edi ; InterlockedIncrement(x) ; InterlockedIncrement(x)
769AF0A7                 cmp     eax, 1
769AF0AA                 mov     esi, [ebp+arg_0]
769AF0AD                 jz      loc_769CA020
函数一开始先将全局变量g_cProcessInits加1,后面还比较了加1后变量的值是否为1,因此这应该是一个计数器,并且在第一次执行函数时会进行一些额外的操作,具体如下:

769CA020 loc_769CA020:
769CA020                 call    ?ProcessInitialize@@YGJXZ ; ProcessInitialize(void)
769CA025                 test    eax, eax
769CA027                 mov     [e

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值