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;
}
    文章出处:https://www.cnblogs.com/LyShark/articles/15020041.html
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

                
            
        
浙公网安备 33010602011771号