您的位置:首页 > 其它

COM接口使用简单实现

2017-10-11 16:04 99 查看

模仿com接口

#include <iostream>
using namespace std;

// 定义接口关键字
#define interface struct

// 查询接口
#define QUERYINTERFACE(Interface, iid) \
if(iid == IID_##Interface) \
return static_cast<Interface *>(this);
// 查询不存在的接口
#define QUERYINTERFACE_IUNKNOWN(BaseInterface, iid)\
if(iid == IID_IUnknown) \
return static_cast<IUnknown *>(static_cast<BaseInterface*>(this));  // 向上转型到IUnknown

// 每个接口的uuid,为了方便,这里直接手写
#define IID_IUnknown 0
interface IUnknown {
virtual void* queryInterface(int iid) = NULL;
};

#define IID_IItem 1
interface IItem : public IUnknown {
virtual void showMsg() = NULL;
};

#define IID_IViewItem 2
interface IViewItem : public IItem {
virtual void printMsg() = NULL;
};

#define IID_IData 3
interface IData : public IItem {
virtual int add(int a, int b) = NULL;
};

class PlazaView : public IViewItem, public IData {
public:
void showMsg() {
cout << "showMsg" << endl;
}

void printMsg() {
cout << "printMsg" << endl;
}

int add(int a, int b) {
return a + b;
}

void* queryInterface(int iid) {
QUERYINTERFACE(IViewItem, iid);
QUERYINTERFACE(IData, iid);
QUERYINTERFACE_IUNKNOWN(IViewItem, iid);
return NULL;
}
};

int main()
{
PlazaView p;
IUnknown* iUnknown = (IUnknown*)p.queryInterface(IID_IUnknown);
IData* iData = (IData*)iUnknown->queryInterface(IID_IData);
cout << iData->add(1, 2) << endl;
system("pause");
return 0;
}


关键点

IUnknown* iUnknown = (IUnknown*)p.queryInterface(IID_IUnknown);
IData* iData = (IData*)iUnknown->queryInterface(IID_IData);


暂时不知道怎么描述,先占个坑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  com 接口