#include <stdio.h> #include <malloc.h> #include <iostream> #include <objbase.h> using namespace std; //使用流程为:生成COM对象->获得界面指针->使用->释放. const IID IID_IX = { 0xb9b8ace1, 0xce14, 0x11d0, { 0xae, 0x58, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 } }; const IID IID_IY = { 0xb9b8ace2, 0xce14, 0x11d0, { 0xae, 0x58, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 } }; const IID IID_IZ = { 0xb9b8ace3, 0xce14, 0x11d0, { 0xae, 0x58, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 } }; interface IX:IUnknown { virtual void __stdcall fx(void)=0; }; interface IY:IUnknown { virtual void __stdcall fy(void)=0; }; class CCOM_OBJECT:public IX,public IY { public: CCOM_OBJECT():ref_count(0){} ~CCOM_OBJECT(){} private: virtual HRESULT __stdcall QueryInterface(const IID &iid,void **iface); virtual ULONG __stdcall AddRef(); virtual ULONG __stdcall Release(); virtual void __stdcall fx(void) {cout<<"Function fx has been called"<<endl;} virtual void __stdcall fy(void) {cout<<"Function fy has been called"<<endl;} int ref_count; }; HRESULT __stdcall CCOM_OBJECT::QueryInterface(const IID &iid,void **iface) { if(iid==IID_IUnknown) { cout<<"Requesting IUnkown interface"<<endl; *iface=(IX*)this; } if(iid==IID_IX) { *iface=(IX*)this; } else if(iid==IID_IY) { cout<<"Requesting IY interface"<<endl; *iface=(IY*)this; }else { cout<<"Requesting unknow interface!"<<endl; *iface=NULL; return (E_NOINTERFACE); } ((IUnknown *)(*iface))->AddRef(); return S_OK; } ULONG __stdcall CCOM_OBJECT::AddRef() { cout<<"Adding a reference"<<endl; return(++ref_count); } ULONG __stdcall CCOM_OBJECT::Release() { if(--ref_count==0) { delete this; return 0; } else return ref_count; } IUnknown *CoCreateInstance() { IUnknown *comm_obj=(IX*)new(CCOM_OBJECT); cout<<"Creating Comm object"<<endl; comm_obj->AddRef(); return comm_obj; } int main() { IUnknown *punknown=CoCreateInstance(); IX *pix=NULL; IY *piy=NULL; punknown->QueryInterface(IID_IX,(void **)&pix); pix->fx(); pix->Release(); punknown->QueryInterface(IID_IY,(void**)&piy); piy->fy(); piy->Release(); punknown->Release(); system("pause"); return 0; }