#include "pch.h"
#include
#include
using namespace std;
void trace(const char* msg) { cout << msg << endl; }
//Interfaces start
interface IX :IUnknown
{
virtual void __stdcall Fx() = ;
};
interface IY :IUnknown
{
virtual void __stdcall Fy() = ;
};
interface IZ :IUnknown
{
virtual void __stdcall Fz() = ;
};
//Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
//Interface end
//component start
class CA :public IX, public IY
{
LONG m_cRef;
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
virtual void \_\_stdcall Fx() { cout << "Fx function" << endl; }
virtual void \_\_stdcall Fy() { cout << "Fy function" << endl; }
复制
public:
CA();
~CA() { trace("CA: Destory Self"); }
};
CA::CA()
{
trace("CA: Constrator Self");
m_cRef = ;
}
HRESULT __stdcall CA::QueryInterface(const IID &iid, void **ppv)
{
if (iid == IID_IUnknown)
{
trace("QueryInterface:Return pointer to IUnknown");
* ppv = static_cast
}
else if (iid == IID_IX)
{
trace("QueryInterface:Return pointer to IX");
* ppv = static_cast
}
else if (iid == IID_IY)
{
trace("QueryInterface:Return pointer to IX");
* ppv = static_cast
}
else
{
trace("QueryInteface Interface not supported");
* ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast
return S_OK;
}
ULONG __stdcall CA::AddRef()
{
InterlockedIncrement(&m_cRef);
cout << "CA AddRef -- Ref:" << m_cRef << endl;
return m_cRef;
}
ULONG __stdcall CA::Release()
{
if (InterlockedDecrement(&m\_cRef) == )
{
delete this;
return ;
}
cout << "CA ReleaseRef -- Ref:" << m\_cRef << endl;
return m\_cRef;
}
复制
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast
pI->AddRef();
return pI;
}
// {05464095-EC3A-45b3-8E0C-D1793FBDF13D}
static const IID IID_IX =
{ 0x5464095, 0xec3a, 0x45b3, { 0x8e, 0xc, 0xd1, 0x79, 0x3f, 0xbd, 0xf1, 0x3d } };
// {39696224-3AE3-4b46-B056-99359CAC6CA9}
static const IID IID_IY =
{ 0x39696224, 0x3ae3, 0x4b46, { 0xb0, 0x56, 0x99, 0x35, 0x9c, 0xac, 0x6c, 0xa9 } };
// {6684A06D-64B8-46f3-9988-CDC119E18165}
static const IID IID_IZ =
{ 0x6684a06d, 0x64b8, 0x46f3, { 0x99, 0x88, 0xcd, 0xc1, 0x19, 0xe1, 0x81, 0x65 } };
//component end
//client start
int main(int argc, char* argv[])
{
HRESULT hr;
trace("Client: Get an IUnknown pointer");
IUnknown* pIUnknown = CreateInstance();
IX* pIx = NULL;
trace("Client: Get Interface IX");
hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIx);
if (SUCCEEDED(hr))
{
trace("Client: Succeed Get Interface IX");
pIx->Fx();
}
IY\* pIY = NULL;
hr = pIUnknown->QueryInterface(IID\_IY, (void\*\*)&pIY);
pIUnknown->Release();
if (SUCCEEDED(hr))
{
trace("Client: Succeed GetInterface IY");
pIY->Fy();
pIY->Release();
}
//Query IY from IX
IY\* pIYfromIX = NULL;
hr = pIx->QueryInterface(IID\_IY, (void\*\*)&pIYfromIX);
if (SUCCEEDED(hr))
{
trace("Client: Succeed GetInterfae IY from pIX");
pIYfromIX->Fy();
pIYfromIX->Release();
}
pIx->Release();
//delete component
// delete pIUnknown;
return ;
}
复制
//client end
参考资料:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章