C/C++ 实现COM转换到接口
2023-02-18 16:46:18 时间
和语言无关,可以在 C++ 中用类的方式来定义。一个 COM 对象可以实现多个接口。
IUnknown:未直接口 一个特殊的接口,所有COM接口都继承IUnKnown这个接口。
interface IUnknown{
HRESULT QueryInterface( // 查询com对象的其他接口指针
[in] REFIID iid, // 接口ID
[out] void **ppv // 接口指针
);
ULONG AddRef(); // 计数+1
ULONG Release(); // 计数-1
}
mylib.h代码:
// 定义一个接口 IAntiCheat 继承 IUnknown
__interface IAntiCheat:public IUnknown{
// 接口虚函数
virtual BOOL IAntiCheat_PUBG(string& Tag);
};
// 定义一个类 Inherit 继承 IAntiCheat 接口
class Inherit:public IAntiCheat{
public:
// 声明 IUnknown 成员
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef() { return 0;}
virtual ULONG __stdcall Release() { return 0;}
// 声明自己的虚函数
virtual BOOL IAntiCheat_PUBG(string& Tag);
};
// 声明 CreateInstance 接口创建函数
IUnknown* CreateInstance();
mylib.cpp 代码:
// 初始化接口ID
static const GUID IID_IAntiCheat = {0x4abc66d,0xba5f,0x4e17,{0x82,0xfd,0x98,0x5d,0x9c,0x0,0x73,0xfe}};
// 实现自己的接口函数
BOOL Inherit::IAntiCheat_PUBG(string& Tag)
{
// 你的代码...
return 0;
}
// 实现 QueryInterface
HRESULT __stdcall Inherit::QueryInterface(const IID& iid, void** ppv){
// 初始化由 Inherit 重载的 IUnknown 指针
IUnknown* pI = static_cast<IAntiCheat*>(new Inherit);
// 如果 接口ID 符合条件则绑定接口函数
if(iid == IID_IAntiCheat){*ppv = static_cast<IAntiCheat*>(pI);}
else{
*ppv = NULL;
// 返回接口对象创建失败标志
return E_NOINTERFACE;
}
// 增加计数
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
// 实现 CreateInstance 接口创建函数
IUnknown* CreateInstance(){
// 初始化由 Inherit 重载的 IUnknown 指针
IUnknown* pI = static_cast<IAntiCheat*>(new Inherit);
// 增加计数
pI->AddRef();
return pI ;
}
test.cpp 代码:
int _tmain(int argc, _TCHAR* argv[])
{
// 初始化接口ID
static const GUID IID_IAntiCheat = {0x4abc66d,0xba5f,0x4e17,{0x82,0xfd,0x98,0x5d,0x9c,0x0,0x73,0xfe}};
// 创建接口
IUnknown* pIUnknown = CreateInstance();
// 调用 QueryInterface,获取接口类指针
IAntiCheat* pIAntiCheat = NULL;
HRESULT hr = pIUnknown->QueryInterface(
IID_IAntiCheat,
(void**)&pIAntiCheat
);
// 判断 QueryInterface 是否执行成功
if (SUCCEEDED(hr)){
// 调用你的接口函数
string Tag;
pIAntiCheat->IAntiCheat_PUBG(Tag);
}
getchar();
return 0;
}
相关文章
- Golang语言情怀--第97期 区块链技术-以太坊公链合约部署-第3节:合约转Go语言代码
- Golang语言情怀--第98期 区块链技术-以太坊公链合约部署-第4节:MetaMask钱包连接到本地环境
- Golang语言情怀--第99期 区块链技术-以太坊公链合约部署-第5节:部署合约到以太坊公链
- Golang语言情怀--第100期 区块链技术-以太坊公链NFT图片去中心化存储-第1节:IPFS存储方案
- Golang语言情怀--第101期 区块链技术-以太坊公链NFT图片去中心化存储-第2节:go语言实现IPFS存储demo
- Golang语言情怀--第102期 区块链技术-通过区块链技术告诉你是“斯人”还是“是人”
- Golang语言情怀--第103期 区块链技术-关于区块链中的智能合约:您想知道的一切
- Power BI模拟谷歌2022搜索排行榜
- gTasks Pro for Mac(Google任务管理器) 中文
- mongodb的安装
- 关于GO语言,这篇文章讲的很明白
- 你在开发过程中使用Git Rebase还是Git Merge?
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性那些事(2)- RT685SFVK性能实测(Dhrystone)
- 痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)
- 痞子衡嵌入式:恩智浦MCX系列MCU开发那些事 - 索引
- 痞子衡嵌入式:如果你正在量产i.MX RT产品,不妨试试这款神器RT-Flash
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU量产神器RT-Flash常见问题
- 从四个问题透析Linux下C++编译&链接
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU量产神器RT-Flash用户指南
- 痞子衡嵌入式:如果i.MX RT是一匹悍马,征服它时别忘了用马镫MCUBootUtility