- IUnknown , IExtensibleObject, . IExtensibleObject, , :
class IExtensibleObject { public: virtual void *Dynamic_Cast(const char* pszType) = 0; virtual void DuplicatePointer(void) = 0; virtual void DestroyPointer(void) = 0; }
Dynamic_Cast, C++ dynamic_cast. , , DuplicatePointer. , , DestroyPointer. IUnknown C++:
extern " " const IID IID_IUnknown: interface IUnknown { virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv) = 0; virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0; virtual ULONG STDMETHODCALLTYPE Release(void) = 0; };
SDK interface C++ struct, . , , , , public . - , STDMETHODCALLTYPE. Win32, Microsoft C++ _stdcall.
IUnknown IExtensibleObject. QueryInterface ++- dynamic_cast. AddRef , . Release , , , . IUnknown , , , IUnknown GUID, .
IDL- IUnknown unknwn.idl SDK, :
// unknwn.idl - system IDL file // unknwn.idl - IDL [ local, object, uuid (00000000-0000-0000-C000-000000000046) ] interface IUnknown { HRESULT QueryInterface([in] REFIID riid, [out] void **ppv); ULONG AddRef(void); ULONG Release(void); }
local . , , HRESULT. , IUnknown . , , IDL- , SDK, , . , . SDK.
IUnknown - . IUnknown , . IUnknown - , , , IUnknown, - . , vtbl, : QueryInterface, AddRef Release. vtbl, .
IDL, IDL- , import, IDL- :
// calculator.idl [object, uuid(BDA4A270-A1BA-11dO-8C2C-0080C73925BA)] interface ICalculator : IUnknown { import "unknwn.idl"; // bring in def. of IUnknown // IUnknown HRESULT Clear(void); HRESULT Add([in] long n); HRESULT Sum([out, retval] long *pn); }
import , , . import , IDL- . C/C++ / ++- IDL- , , import IDL- #include / ++- :
// calculator.h - generated by MIDL // calculator.h - MIDL // bring in def. of IUnknown // IUnknown #include "unknwn.h" extern "C" const IID IID_ICalculator; interface ICalculator : public IUnknown { virtual HRESULT STDMETHODCALLTYPE Clear(void) = 0; virtual HRESULT STDMETHODCALLTYPE Add(long n) = 0; virtual HRESULT STDMETHODCALLTYPE Sum(long *pn) = 0; }
MIDL - , GUID, IDL- :
// calculator_i. - generated by MIDL const IID IID_ICalculator = { 0xBDA4A270, 0xA1BA, 0x11d0, { 0x8C, 0x2C, 0x00, 0 80, 0 C7, 0 39, 0x25, 0xBA } };
, , calculator_i.c (makefile), calculator_i.c C++ . , IID_ICalculator 128- .
, IUnknown. IDL :
import "unknwn.idl"; [object, uuid(DF12E151-A29A-11d0-8C2D-0080C73925BA)] interface IAnimal : IUnknown { HRESULT Eat(void); } [object, uuid(DF12E152-A29A-11d0-8C2D-0080C73925BA)] interface ICat : IAnimal { HRESULT IgnoreMaster(void); } [object, uuid(DF12E153-A29A-11d0-8C2D-0080C73925BA)] interface IDog : IAnimal { HRESULT Bark(void); } [object, uuid(DF12E154-A29A-11d0-8C2D-0080C73925BA)] interface IPug : IDog { HRESULT Snore(void); } [object, uuid(DF12E155-A29A-11d0-8C2D-0080C73925BA)] interface IOldPug : IPug { HRESULT SnoreLoudly(void); }
: . :
[object, uuid(DF12E156-A29A-11d0-8C2D-0080C73925BA)] interface ICatDog : ICat, IDog { // illegal, multiple bases // , HRESULT Meowbark(void); }
. , C++ . , . DCE RPC. DCE RPC . , , , . , Cat/Dog - :
class CatDog : public ICat, public IDog { // ... };
, Cat/Dog, QueryInterface . QueryInterface , Cat/Dog , . , .
, , . , .
2.4 CatDog. , : , CatDog : ICat, IDog, IAnimal IUnknown.