从ASM代码中分析MFC与ATL在COM组件开发中的差异和优劣

本文是MFC与ATL在COM组件开发中的差异和优劣的续篇。

主要是通过C++中的模板和多重继承的语言特性,从ASM汇编层面,来分析MFC与ATL的差异和优劣。


MFC代码部分


MFC中,一个COM类可以包含多个接口,每个接口对象都是一个COM类的成员变量。
例如IWelcome,IMath接口对象就是成员变量m_xWelcome,m_xMath。

var class address
pThis CComMFCDemo* 0x00ff9110
pThis->m_xWelcome CComMFCDemo::XWelcome* 0x00ff9130
pThis->m_xMath CComMFCDemo::XMath* 0x00ff9134

每当访问接口方法的时候,需要根据当前接口对象指针,计算出COM对象指针,并调用COM对象的功能函数。
计算的方式就是使用METHOD_PROLOGUE()宏。

#define METHOD_PROLOGUE(theClass, localClass) \
    theClass* pThis = \
        ((theClass*)((BYTE*)this - offsetof(theClass, m_x##localClass))); \
...

#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))

对于接口IWelcome,计算后的COM对象指针为:
METHOD_PROLOGUE(CComMFCDemo, Welcome)

offset = &( ((CComMFCDemo*)0)->m_xWelcome )
pThis = this - offset

对于接口IMath,计算后的COM对象指针为:
METHOD_PROLOGUE(CComMFCDemo, Math)

offset = &( ((CComMFCDemo*)0)->m_xMath )
pThis = this - offset

不同的接口对象,有不同的this地址偏移值。


编译平台(x86)

STDMETHODIMP CComMFCDemo::DUAL_INTERFACE(Welcome)::Greeting(BSTR name, BSTR *message)
{
//      this    0x00ff9130 {
  ...}    CComMFCDemo::XWelcome *
    METHOD_PROLOGUE(CComMFCDemo, Welcome)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值