MFC与ATL在COM组件开发中的差异和优劣

本文分析了MFC和ATL在COM组件开发中的差异和优劣。ATL通过模板类和多重继承简化了COM开发,减少了编码工作量,提高了代码质量,降低了维护难度,而MFC则依赖宏定义且需要更多手动配置。ATL生成的组件不依赖MFC运行库,但可能限制在C#中的泛化能力。在实际开发中,ATL通常更为便捷和强大。
摘要由CSDN通过智能技术生成

很多年前,微软提供了COM组件对象模型。
随后,提供了COM SDK。
后来,又在MFC中,增加了COM开发的支持。
再后来,又提供了ATL类库,对COM开发提供了更强大的支持。

本文从使用MFC和ATL开发COM组件的角度,来分析比较两者的差异和优劣。


MFC代码部分


首先,需要继承一个基类,并声明成动态创建类(RuntimeClass)。

//.h
class CComMFCDemo : public CCmdTarget
{
DECLARE_DYNCREATE(CComMFCDemo)
};

//.cpp
IMPLEMENT_DYNCREATE(CComMFCDemo, CCmdTarget)

然后,声明并实现COM功能函数。

//.h
class CComMFCDemo : public CCmdTarget
{
    BSTR Greeting(BSTR name);
    long Add(long val1, long val2);
    long Sub(long val1, long val2);
};

//.cpp
BSTR CComMFCDemo::Greeting(BSTR name)
{
    CComBSTR tmp("Welcome, ");
    tmp.Append(name);
    return tmp;
}
long CComMFCDemo::Add(long val1, long val2)
{
    return val1 + val2;
}
long CComMFCDemo::Sub(long val1, long val2)
{
    return val1 - val2;
}

然后,声明并实现接口。
这里,为了通用性,使用了双重接口定义。并且,声明了两个不同的接口类型。即IWelcome和IMath。

//.h
class CComMFCDemo : public CCmdTarget
{
    BEGIN_DUAL_INTERFACE_PART(Welcome, IWelcome)
        STDMETHOD(Greeting)(BSTR name, BSTR *message);
    END_INTERFACE_PART(Welcome)

    BEGIN_DUAL_INTERFACE_PART(Math, IMath)
        STDMETHOD(Add)(LONG val1, LONG val2, LONG* result);
        STDMETHOD(Sub)(LONG val1, LONG val2, LONG* result);
    END_INTERFACE_PART(Math)
};

//.cpp
DELEGATE_DUAL_INTERFACE(CComMFCDemo, Welcome)

STDMETHODIMP CComMFCDemo::DUAL_INTERFACE(Welcome)::Greeting(BSTR name, BSTR *message)
{
    METHOD_PROLOGUE(CComMFCDemo, Welcome)
    *message = pThis->Greeting(name);
    return S_OK;
}

DELEGATE_DUAL_INTERFACE(CComMFCDemo, Math)

STDMETHODIMP CComMFCDemo::DUAL_INTERFACE(Math)::Add(LONG 
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值