COM的INTERFACE使用实践
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使用实践相关推荐
- 别着急学软件!先掌握科学有效的UI设计自学姿势(超全面)
编者按:这可能是有史以来最值得阅读转发的一篇UI设计自学指南.作者是个全栈设计师,在临摹了大量教程,掌握了PS.AI等软件后才发现自己对于真正的设计一无所知,因此写了这篇文章,希望能帮大家用正确的方式 ...
- MDCC大会历届PPT集萃
2016 年 9 月 23-24 日,由 CSDN 和创新工场联合主办的"MDCC 2016 移动开发者大会• 中国"(Mobile Developer Conference Ch ...
- 自学设计,你真的入门了吗?
写给UI设计初学者们 几乎每隔几天我便能在简书或其他各类设计网站看到关于自学UI设计的分享文章.这些文章有一个共同的特点,就是描述作者如何从一个零基础的设计小白,通过种种途径,成长为一个熟练掌握PS或 ...
- @Validated数据校验
@Validated数据校验 前言 为了减少代码进行对数据进行校验,利用@Validated来进行注解形式的数据校验 创建实体类 @Data @FieldDefaults(level = Access ...
- Golang的interface实践
这是第二个我在别的语言里面没有见过的实现,go的interface可以说是独树一帜,让我们仔细来实践一下. interface类型是什么?interface类型定义了一组方法,如果某个对象实现了某个接 ...
- Go语言-Go interface 接口的最佳实践
文章目录 Go语言-Go 接口的最佳实践 什么是Golang中的interface 编写接口的最佳实践 1. 保持interfaces足够小 2. Interfaces Should Have No ...
- 使用 Java Native Interface 的最佳实践
2019独角兽企业重金招聘Python工程师标准>>> 程序员在使用 JNI 时的 5 大性能缺陷如下: 不缓存方法 ID.字段 ID 和类 触发数组副本 回访(Reaching b ...
- 重构实践:体验interface的威力(一)
背景 GIX4是一个建筑行业的指标计算软件,用于数据统计.分析.导入的大量数据,大部分呈现逻辑上的树状结构(关于它的重构,见:<重构一个繁琐的数据结构>),关系复杂.这些数据,需要经过由底 ...
- [JAVA EE] JPA 技术实践:完成增、删、改、查操作
项目已上传:https://codechina.csdn.net/qq_36286039/javaee 注意本项目是包含后文JPA 查询用法内容的,若您想看只有本文内容的项目,请下载: https:/ ...
最新文章
- java 中的内部类介绍
- mysql基础什么意思,Mysql一些基本概念
- VTK:可视化算法之CutWithScalars
- 1024程序员节获奖通知
- dosbox edit.exe 如何使用_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...
- mybatis 多参数处理
- jquery判断页面标签是否存在
- Docker教程小白实操入门(15)--如何使用WORKDIR、ENV、ARG和EXPOSE设置镜像
- Linux下安装Zookeeper环境
- 锂离子电池容量保持率和容量恢复率
- steam一键授权工具_Sam Haynor的100个STEAM项目
- ichariot测试路由器有线转发性能
- 一、Webservice的概念和原理
- python入门学习——6种方法求n的阶乘(8种写法)
- java中的undefined_undefined是什么意思啊?
- Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
- 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))
- 机器学习之随机森林RandomForestRegressor
- 好记性不如烂笔头、多记笔记、多总结、多反思
- Python使用Turtle画孟加拉国国旗