COM 개체에서 IUnknown::QueryInterface 메서드 구현을 제어하는 세 가지 주요 규칙이 있습니다.
- 개체에는 ID가 있어야 합니다.
- 개체 인스턴스의 인터페이스 집합은 정적이어야 합니다.
- 다른 인터페이스에서 개체의 모든 인터페이스를 쿼리할 수 있어야 합니다.
개체에 ID가 있어야 합니다.
지정된 개체 인스턴스의 경우 IID_IUnknown QueryInterface 호출은 항상 동일한 실제 포인터 값을 반환해야 합니다. 이렇게 하면 두 인터페이스에서 QueryInterface 호출하고 결과를 비교하여 개체의 동일한 인스턴스를 가리키는지 여부를 확인할 수 있습니다.
개체 인스턴스의 인터페이스 집합은 정적이어야 합니다.
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 사용 및 구현