代码改变世界

MFC对COM的支持

  Clingingboy  阅读(1709)  评论(0编辑  收藏  举报

 

一.COM接口映射表

BEGIN_INTERFACE_PART(Dictionary, IDictionary)
    INIT_INTERFACE_PART(CDictionary, Dictionary)
    STDMETHOD_(BOOL, Initialize)();
    STDMETHOD_(BOOL, LoadLibrary)(LPOLESTR);
    STDMETHOD_(BOOL, InsertWord)(LPOLESTR, LPOLESTR);
    STDMETHOD_(void, DeleteWord)( LPOLESTR);
    STDMETHOD_(BOOL, LookupWord)(LPOLESTR, LPOLESTR *);
    STDMETHOD_(BOOL, RestoreLibrary)(LPOLESTR);
    STDMETHOD_(void, FreeLibrary)();
END_INTERFACE_PART_STATIC(Dictionary) 
#define BEGIN_INTERFACE_PART(localClass, baseClass) \
    class X##localClass : public baseClass \
    { \
    public: \
        STDMETHOD_(ULONG, AddRef)(); \
        STDMETHOD_(ULONG, Release)(); \
        STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj); \

#ifndef _AFX_NO_NESTED_DERIVATION
#define BEGIN_INTERFACE_PART_DERIVE(localClass, baseClass) \
    class X##localClass : public baseClass \
    { \
    public: \

#else
#define BEGIN_INTERFACE_PART_DERIVE(localClass, baseClass) \
    BEGIN_INTERFACE_PART(localClass, baseClass) \

#endif
#define END_INTERFACE_PART(localClass) \
    } m_x##localClass; \
    friend class X##localClass; \

展开刚好是一个内部类,这样就省得写IUnknown的三个方法

IUnknown的实现

调用基类的三个方法就可以了

/////////////////////////////////////////////////////////////////////////////
// CDictionaryObj::XSpellCheck
STDMETHODIMP_(ULONG) CDictionaryObj::XSpellCheck::AddRef()
{
    METHOD_PROLOGUE_EX_(CDictionaryObj, SpellCheck)
    return (ULONG)pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CDictionaryObj::XSpellCheck::Release()
{
    METHOD_PROLOGUE_EX_(CDictionaryObj, SpellCheck)
    return (ULONG)pThis->ExternalRelease();
}

STDMETHODIMP CDictionaryObj::XSpellCheck::QueryInterface(
    REFIID iid, LPVOID* ppvObj)
{
    METHOD_PROLOGUE_EX_(CDictionaryObj, SpellCheck)
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

三.引出函数

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return AfxDllGetClassObject(rclsid, riid, ppv);
}

STDAPI DllCanUnloadNow(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return AfxDllCanUnloadNow();
}

// by exporting DllRegisterServer, you can use regsvr.exe
STDAPI DllRegisterServer(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    COleObjectFactory::UpdateRegistryAll();
    return S_OK;
}
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2010-06-09 .net 4.0新特性-延迟初始化:Lazy(转),ThreadLocal<T>
2010-06-09 .net 4.0新特性-并行编程(转)
2010-06-09 .net 4.0新特性-tuple
2009-06-09 show部分书...
点击右上角即可分享
微信分享提示