'QueryInterface'에 해당되는 글 1건

  1. 2012.12.03 QueryInterface

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 InterfaceIX의포인터값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를 감소시킨다.





Posted by No names
,