- C++에서는 다중 상속이 가능(MFC 에서는 불가)
interface ICalcu : IUnknown
{
virtual int __stdcall Sum() = 0;
};
GUID - 고유한 컴포넌트임을 알려주는 키값 (Guigen을 이용해 생성한다)
CLSID - CoClass의 GUID , IID - 인터페이스의 GUID
typedef GUID IID;
typedef GUID CLSID;
#define REFIID const IID &
#define REFCLSID const CLSID &
•IID 및 CLSID는 GUID를 재정의 하여 사용하는 것 뿐이다
// {7D1DA4D3-2DD8-4317-937D-157BF19DE48C}
static const IID IID_ISetVal =
{ 0x7d1da4d3, 0x2dd8, 0x4317, { 0x93, 0x7d, 0x15, 0x7b, 0xf1, 0x9d, 0xe4, 0x8c } };
// {1BA9514E-9303-4c4d-948A-D1EAA0932A82}
static const IID IID_ICalcu =
{ 0x1ba9514e, 0x9303, 0x4c4d, { 0x94, 0x8a, 0xd1, 0xea, 0xa0, 0x93, 0x2a, 0x82 } };
•IID 값은 IUnknown의 QueryInterface 구현부에서 다수의 사용자 인터페이스를 구별하여 올바른 포인터 값을 반환할 수 있도록 한다.
Interface Inheritance
class CInsideCom : public ISetVal, ICalcu
{
public:
•Interface는 구성하고자 하는 Component 클래스에 의해 상속될 수 있다.
•Component 클래스는 상속된 Interface의 Pure Virtual Function에 대하여 그 구현을 제공 해야 한다.
•이렇게 상속된 Interface는 객체 생성시 Virtual Function Table이 구성된다.
//IUnknown Interface
virtual HRESULT __stdcall QueryInterface(REFIID riid, void **ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
//ISetVal Interface
virtual void __stdcall SetXY(int, int);
//ICalcu Interface
virtual int __stdcall Sum();
•ISetVal과 ICalcu 인터페이스를 상속 받았고, 순수가상함수에 대하여 재정의 하기 위한
CInsideCom클래스는 아래와 같이 인터페이스(가상함수테이블)가 구성되있겠다.
QurryInterface, AddRef, ,Relese, Sum, ISetVal