QueryInterface
개체가 정적으로 제공하는 기능을 표현할 수 있는 메커니즘이 있지만(인스턴스화되기 전에) 기본 COM 메커니즘은 호출QueryInterface
된 메서드를 IUnknown
사용하는 것입니다.
모든 인터페이스는 파생 IUnknown
되므로 모든 인터페이스의 구현 QueryInterface
이 있습니다. 구현에 관계없이 이 메서드는 호출자가 포인터를 원하는 인터페이스를 사용하여 IID
개체를 쿼리합니다. 개체가 해당 인터페이스 QueryInterface
를 지원하는 경우 호출하는 동안 인터페이스에 대한 포인터를 AddRef
검색합니다. 그렇지 않으면 오류 코드를 반환합니다 E_NOINTERFACE
.
항상 참조 계산 규칙을 준수해야 합니다. 인터페이스 포인터를 호출 Release
하여 참조 수를 0으로 줄이면 해당 포인터를 다시 사용하면 안 됩니다. 경우에 따라 개체에 대한 약한 참조를 가져와야 할 수 있습니다(즉, 참조 수를 증가시키지 않고 해당 인터페이스 중 하나에 대한 포인터를 가져올 수 있음). 그러나 다음에 Release
호출 QueryInterface
하여 이 작업을 수행하는 것은 허용되지 않습니다. 이러한 방식으로 가져온 포인터는 유효하지 않으므로 사용하면 안 됩니다. 이 방법은 정의될 때 _ATL_DEBUG_INTERFACES
더 쉽게 명백해지므로 이 매크로를 정의하는 것은 참조 계산 버그를 찾는 유용한 방법입니다.