INTERFACE用于声明库的接口,下面我们将实现一个简易的数学库来实践一下。

我们首先声明一个接口类IMath,该类继承自IUnknown;IMath有两个方法供外部调用,分别为add和sub

#undef INTERFACE
#define INTERFACE IMath
DECLARE_INTERFACE_(IMath, IUnknown)
{STDMETHOD_(int, add)(THIS_ const int x, const int y) PURE;STDMETHOD_(int, sub)(THIS_ const int x, const int y) PURE;
};

接下来我们定义一个实现类MathImp,MathImp继承接口类IMath,由于IMath继承IUnknown,所以我们需要实现QueryInterface/AddRef/Rlease这三个函数,否则编译不过。我们在MathImp中声明这三个函数

class MathImp : public IMath
{
public:MathImp();virtual ~MathImp();public:STDMETHOD(QueryInterface) (THIS_ REFIID riid, _COM_Outptr_ void** ppvObj) override;STDMETHOD_(ULONG, AddRef) (THIS) override;STDMETHOD_(ULONG, Release) (THIS) override;public:STDMETHOD_(int, add)(THIS_ const int x, const int y) override;STDMETHOD_(int, sub)(THIS_ const int x, const int y) override;private:volatile LONG m_cRef;
};

接下来我们实现MathImp,下面这三个接口是IUnknown规定要实现的

STDMETHODIMP MathImp::QueryInterface(REFIID riid, void **ppvObj)
{if (ppvObj == NULL){return E_INVALIDARG;}*ppvObj = NULL;if (IsEqualIID(riid, __uuidof(IUnknown)) || IsEqualIID(riid, IID_IUnknown)){*ppvObj = (IUnknown *)this;}if (*ppvObj){AddRef();return S_OK;}return E_NOINTERFACE;
}STDMETHODIMP_(ULONG) MathImp::AddRef(void)
{return (ULONG)InterlockedIncrement(&m_cRef);
}STDMETHODIMP_(ULONG) MathImp::Release(void)
{LONG ret = InterlockedDecrement(&m_cRef);if (ret == 0){delete this;}return ret;
}

终于到了实用部分,下面这两个接口是我们真正提供给外部调用的逻辑接口

int MathImp::add(THIS_ const int x, const int y)
{return x + y;
}int MathImp::sub(THIS_ const int x, const int y)
{return x - y;
}

ok,到这里我们的简易数学库就实现的差不多了,剩下的工作是提供C语言的创建/释放接口,不是本文的重点,请查看源代码。

接下来,我们写个demo来测试这个库,看是否运行正常。

我们通过VS创建一个控制台项目,引入刚刚我们编写的库,调用C语言接口创建数学库实例,再调用数学库的Add方法对两个数字进行加法运算

#include "../interface/iMath.h"#pragma comment(lib, "interface.lib")using namespace System;int main(array<System::String ^> ^args)
{IMathModulePtr pMathModule = CreateMathModule();int out = pMathModule->add(2, 8);Console::WriteLine(L"Add 2 and 8: ");Console::WriteLine(out);system("pause");ReleaseMathModule();return 0;
}

运行结果:

ok,运行正常。

整个工程的源代码:

test/vs/interface at master · ChriFang/test · GitHubhttps://github.com/ChriFang/test/tree/master/vs/interface

参考文章:

com中的宏DECLARE_INTERFACE_『一木浮生』 的专栏-CSDN博客#undef INTERFACE#define INTERFACE ICustomResolverDECLARE_INTERFACE_(ICustomResolver, Iunknown){  //** IUnknown methods   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObhttps://blog.csdn.net/chengshi520aaa/article/details/7492680

COM的INTERFACE使用实践相关推荐

  1. 别着急学软件!先掌握科学有效的UI设计自学姿势(超全面)

    编者按:这可能是有史以来最值得阅读转发的一篇UI设计自学指南.作者是个全栈设计师,在临摹了大量教程,掌握了PS.AI等软件后才发现自己对于真正的设计一无所知,因此写了这篇文章,希望能帮大家用正确的方式 ...

  2. MDCC大会历届PPT集萃

    2016 年 9 月 23-24 日,由 CSDN 和创新工场联合主办的"MDCC 2016 移动开发者大会• 中国"(Mobile Developer Conference Ch ...

  3. 自学设计,你真的入门了吗?

    写给UI设计初学者们 几乎每隔几天我便能在简书或其他各类设计网站看到关于自学UI设计的分享文章.这些文章有一个共同的特点,就是描述作者如何从一个零基础的设计小白,通过种种途径,成长为一个熟练掌握PS或 ...

  4. @Validated数据校验

    @Validated数据校验 前言 为了减少代码进行对数据进行校验,利用@Validated来进行注解形式的数据校验 创建实体类 @Data @FieldDefaults(level = Access ...

  5. Golang的interface实践

    这是第二个我在别的语言里面没有见过的实现,go的interface可以说是独树一帜,让我们仔细来实践一下. interface类型是什么?interface类型定义了一组方法,如果某个对象实现了某个接 ...

  6. Go语言-Go interface 接口的最佳实践

    文章目录 Go语言-Go 接口的最佳实践 什么是Golang中的interface 编写接口的最佳实践 1. 保持interfaces足够小 2. Interfaces Should Have No ...

  7. 使用 Java Native Interface 的最佳实践

    2019独角兽企业重金招聘Python工程师标准>>> 程序员在使用 JNI 时的 5 大性能缺陷如下: 不缓存方法 ID.字段 ID 和类 触发数组副本 回访(Reaching b ...

  8. 重构实践:体验interface的威力(一)

    背景 GIX4是一个建筑行业的指标计算软件,用于数据统计.分析.导入的大量数据,大部分呈现逻辑上的树状结构(关于它的重构,见:<重构一个繁琐的数据结构>),关系复杂.这些数据,需要经过由底 ...

  9. [JAVA EE] JPA 技术实践:完成增、删、改、查操作

    项目已上传:https://codechina.csdn.net/qq_36286039/javaee 注意本项目是包含后文JPA 查询用法内容的,若您想看只有本文内容的项目,请下载: https:/ ...

最新文章

  1. java 中的内部类介绍
  2. mysql基础什么意思,Mysql一些基本概念
  3. VTK:可视化算法之CutWithScalars
  4. 1024程序员节获奖通知
  5. dosbox edit.exe 如何使用_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...
  6. mybatis 多参数处理
  7. jquery判断页面标签是否存在
  8. Docker教程小白实操入门(15)--如何使用WORKDIR、ENV、ARG和EXPOSE设置镜像
  9. Linux下安装Zookeeper环境
  10. 锂离子电池容量保持率和容量恢复率
  11. steam一键授权工具_Sam Haynor的100个STEAM项目
  12. ichariot测试路由器有线转发性能
  13. 一、Webservice的概念和原理
  14. python入门学习——6种方法求n的阶乘(8种写法)
  15. java中的undefined_undefined是什么意思啊?
  16. Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
  17. 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))
  18. 机器学习之随机森林RandomForestRegressor
  19. 好记性不如烂笔头、多记笔记、多总结、多反思
  20. Python使用Turtle画孟加拉国国旗

热门文章

  1. 网站关键词优化的五点原则
  2. 曾經很愛很愛伱,洳紟莪巳經放棄,哆謝伱啲鈈珍惜讓莪學茴迉惢,深噯灬伱时﹎ o放ヅ棄 我﹖ヅo
  3. 干净实用:装机必备绿色软件集锦
  4. “快来”为你解读视联网发展阶段之婴儿篇
  5. 虚拟换衣 CP-VTON 论文笔记
  6. 2021年全球与中国腰椎间盘突出行业市场规模及发展前景分析
  7. 2015在大型多人在线游戏市场报告
  8. Android开发自定义UI组件
  9. 设计模式总结-结构型模式
  10. VMware的下载安装