com入门小事例!理解com中的QueryInterface
// testdll继承.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "String.h"
typedef char* String1;
class IMyUnknown
{
public :
static int IID_IUnknown;
public:
virtual int QueryInterface(const int &iid, void **ppv)=0;
virtual int AddRef()=0;
virtual int Release()=0;
};
class IDictionary : public IMyUnknown
{
public :
static int IID_Dictionary;
public :
virtual int LookupWord(String1, String1)=0;
};
class ISpellCheck : public IMyUnknown
{
public :
static int IID_SpellCheck;
public :
virtual int CheckWord(String1, String1)=0;
};
class CDictionary : public IDictionary , public ISpellCheck
{
public :
CDictionary();
~CDictionary();
public :
// IUnknown member function
int QueryInterface(const int &iid, void **ppv) ;
int AddRef() ;
int Release() ;
// IDictionary member function
int LookupWord(String1, String1);
// ISpellCheck member function
int CheckWord (String1, String1);
public :
static int IID;
private :
int m_Ref ;
};
CDictionary::CDictionary()
{
m_Ref = 0;
}
CDictionary::~CDictionary()
{
}
int CDictionary::QueryInterface(const int &iid, void **ppv)
{
if ( iid == IID_IUnknown )
{
*ppv = (IDictionary *) this ;
((IDictionary *)(*ppv))->AddRef() ;
} else if ( iid == IID_Dictionary )
{
*ppv = (IDictionary *) this ;
((IDictionary *)(*ppv))->AddRef() ;
} else if ( iid == IID_SpellCheck )
{
*ppv = (ISpellCheck *) this ;
((ISpellCheck *)(*ppv))->AddRef() ;
}
else
{
*ppv = NULL;
return 0 ;
}
return 1;
}
int CDictionary::AddRef()
{
m_Ref ++;
return (int) m_Ref;
}
int CDictionary::Release()
{
m_Ref --;
if (m_Ref == 0 ) {
delete this;
return 0;
}
return (int) m_Ref;
}
int CDictionary::LookupWord(String1 word, String1 resultWord)
{
strcpy(resultWord,word);
return 1;
}
int CDictionary::CheckWord (String1 word, String1 resultWord)
{
char *pWord =word;
resultWord = strlwr(pWord);
delete pWord;
return 1;
}
int IMyUnknown::IID_IUnknown=1;
int IDictionary::IID_Dictionary=2;
int ISpellCheck::IID_SpellCheck=3;
int CDictionary::IID=4;
int _tmain(int argc, _TCHAR* argv[])
{
IMyUnknown *pMyUnknown;
IDictionary *pDictionary;
ISpellCheck *pSpellCheck;
char String1Result[50];
CDictionary *pObject=new CDictionary();
pObject->QueryInterface(IMyUnknown.IID_IUnknown,(void **)&pMyUnknown);
pMyUnknown->QueryInterface(IDictionary.IID_Dictionary,(void **)&pDictionary);
pDictionary->LookupWord("tiger", String1Result);
printf("%s",String1Result);
pDictionary->Release();
pMyUnknown->Release();
}