다음을 통해 공유


QueryInterface 구현 규칙

COM 개체에서 IUnknown::QueryInterface 메서드 구현을 제어하는 세 가지 기본 규칙이 있습니다.

  • 개체에는 ID가 있어야 합니다.
  • 개체 instance 인터페이스 집합은 정적이어야 합니다.
  • 다른 인터페이스에서 개체의 모든 인터페이스를 쿼리할 수 있어야 합니다.

개체에 ID가 있어야 합니다.

지정된 개체 instance 대해 IID_IUnknown 있는 QueryInterface 호출은 항상 동일한 물리적 포인터 값을 반환해야 합니다. 이렇게 하면 두 인터페이스에서 QueryInterface를 호출하고 결과를 비교하여 개체의 동일한 instance 가리키는지 여부를 확인할 수 있습니다.

개체 인스턴스의 인터페이스 집합은 정적이어야 합니다.

QueryInterface를 통해 개체에서 액세스할 수 있는 인터페이스 집합은 동적이 아니라 정적이어야 합니다. 특히 QueryInterface 가 지정된 IID에 대한 S_OK 한 번 반환하는 경우 동일한 개체에 대한 후속 호출에서 E_NOINTERFACE 반환해서는 안 됩니다. QueryInterface 가 지정된 IID에 대한 E_NOINTERFACE 반환하는 경우 동일한 개체에서 동일한 IID에 대한 후속 호출은 S_OK 반환해서는 안됩니다.

다른 인터페이스에서 개체의 모든 인터페이스에 대해 성공적으로 쿼리할 수 있어야 합니다.

즉, 다음 코드가 제공됩니다.

IA * pA = (some function returning an IA *); 
IB * pB = NULL; 
HRESULT   hr; 
hr = pA->QueryInterface(IID_IB, &pB); 
 

다음 규칙이 적용됩니다.

  • 개체의 인터페이스에 대한 포인터가 있는 경우 동일한 인터페이스에 대해 QueryInterface 에 대한 다음과 같은 호출이 성공해야 합니다.

    pA->QueryInterface(IID_IA, ...) 
    
    
  • 두 번째 인터페이스 포인터에 대한 QueryInterface 호출이 성공하면 첫 번째 인터페이스에 대한 해당 포인터에서 QueryInterface 호출도 성공해야 합니다. pB를 성공적으로 가져온 경우 다음도 성공해야 합니다.

    pB->QueryInterface(IID_IA, ...) 
    
    
  • 모든 인터페이스는 개체의 다른 인터페이스를 쿼리할 수 있어야 합니다. pB를 성공적으로 가져오고 해당 포인터를 사용하여 IC(세 번째 인터페이스)를 성공적으로 쿼리한 경우 첫 번째 포인터인 pA를 사용하여 IC에 대해 성공적으로 쿼리할 수도 있어야 합니다. 이 경우 다음 시퀀스가 성공해야 합니다.

    IC * pC = NULL; 
    hr = pB->QueryInterface(IID_IC, &pC); 
    pA->QueryInterface(IID_IC, ...) 
    
    

인터페이스 구현은 지정된 개체의 모든 인터페이스에 대한 미해결 포인터 참조의 카운터를 유지해야 합니다. 카운터에 부호 없는 정수 를 사용해야 합니다.

클라이언트가 리소스가 해제되었음을 알아야 하는 경우 IUnknown::Release를 호출하기 전에 더 높은 수준의 의미 체계를 가진 개체의 일부 인터페이스에서 메서드를 사용해야 합니다.

IUnknown 사용 및 구현