QueryInterface 메소드
객체가 특정의 COM 인터페이스를 지원하고 있을지 어떨지를 판별한다. 인터페이스가 지원되는 경우, 시스템은 객체의 참조 카운트를 늘리고 그 인터페이스를 바로 사용할 수 있다.
HRESULT QueryInterface( const IID& iid, void** ppv ); |
파라미터
iid : 요구하는 인터페이스의 참조 식별자
*ppv : iid를 통해 전달된 인터페이스가 지원되는 경우에, 인터페이스의 포인터가 저장되는 포인터 변수
리턴값
S_OK(성공) : 요구하는 인터페이스가 지원하는경우 ppv에 인터페이스 포인터를 저장하고 S_OK를 리턴
E_NOINTERFACE(실패) : 요구하는 인터페이스가 지원하지 않을경우
HRESULT __stdcall CA::QUERYINTERFACE(const IID& iid, void** ppv) {
if(iid==IID_IUnknown) { *ppv=static_cast<IX*>(this); //default Interface로IX의포인터값OutParameter ppv를이용하여리턴 } else if(iid==IID_IX) { *ppv=static_cast<IX*>(this); //요구하는인터페이스IX인경우IX의포인터값을OutPrameter ppv를이용하여리턴 } else if(iid==IID_IY) { *ppv=static_cast<IY*>(this); //요구하는인터페이스IY인경우IY의포인터값을OutPrameter ppv를이용하여리턴 } else { //요구하는인터페이스가제공하지않을경우 *ppv=NULL; return E_NOINTERFACE; //인터페이스를제공하지않는E_NOINTERFACE를리턴 }
static_cast<IUnknown>(*ppv)->AddRef(); //Reference Count를늘려줌 return S_OK; //성공! } |
Reference Counting
AddRef() : 인터페이스를 리턴하는 함수는 포인터를 리턴하기 전에 반드시 AddRef()를 호출한다
AddRef를 호출함으로써 Reference Count를 증가 시킨다.
Release() : 인터페이스가 종료되면, 인터페이스에 대한 Release를 호출함으로써 Reference Count를 감소시킨다.