• C/C++ 实现COM转换到接口


    和语言无关,可以在 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;
    }
    

    版权声明: 本博客,文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!

    警告:如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品,请相互尊重!
  • 相关阅读:
    啥是IOC ?啥是DI ?
    Spring是什么?
    Javaweb实训-宠物医院-社区宠物医院登陆页面
    Javaweb实训-宠物医院-社区宠物医院的页面样式
    Bootstrap基础学习(二)
    Bootstrap基础学习(一)
    常用的几种清除float浮动的方法
    jquery的each遍历方法
    正则总结RegExp
    OpenWrt编译到底脚本
  • 原文地址:https://www.cnblogs.com/LyShark/p/15020041.html
Copyright © 2020-2023  润新知