IUnknown::QueryInterface(REFIID,void**) 메서드(unknwn.h)

COM 개체에서 해당 인터페이스 중 하나에 대한 포인터를 쿼리합니다. IID(인터페이스 식별자)에 대한 참조로 인터페이스를 식별합니다. COM 개체가 인터페이스를 구현하는 경우 IUnknown::AddRef 를 호출한 후 해당 인터페이스에 대한 포인터를 반환합니다.

구문

HRESULT QueryInterface(
  REFIID riid,
  void   **ppvObject
);

매개 변수

riid

형식: REFIID

쿼리할 인터페이스의 IID(인터페이스 식별자)에 대한 참조입니다.

ppvObject

형식: void**

riid 매개 변수에 지정된 IID가 있는 인터페이스에 대한 포인터의 주소입니다. 인터페이스 포인터의 주소를 전달하기 때문에 메서드는 쿼리되는 인터페이스에 대한 포인터를 사용하여 해당 주소를 덮어쓸 수 있습니다. 반환이 성공하면 *ppvObject (역참조된 주소)에 요청된 인터페이스에 대한 포인터가 포함됩니다. 개체가 인터페이스를 지원하지 않는 경우 메서드는 *ppvObject (역참조된 주소)를 로 nullptr설정합니다.

반환 값

이 메서드는 인터페이스가 지원되면 S_OK 반환하고, 그렇지 않으면 E_NOINTERFACE . ppvObject(주소)가 이면 이 메서드는 nullptrE_POINTER 반환합니다.

설명

지정된 COM 개체(COM 구성 요소라고도 함)의 경우 개체 인터페이스의 IUnknown 인터페이스 에 대한 특정 쿼리는 항상 동일한 포인터 값을 반환해야 합니다. 이렇게 하면 클라이언트는 IID_IUnknown 사용하여 QueryInterface호출하고 결과를 비교하여 두 포인터가 동일한 구성 요소를 가리키는지 여부를 확인할 수 있습니다. 특히 IUnknown 이외의 인터페이스(동일한 포인터를 통한 동일한 인터페이스)에 대한 쿼리가 동일한 포인터 값을 반환해야 하는 경우는 아닙니다.

QueryInterface 구현에는 네 가지 요구 사항이 있습니다(이 경우 "성공해야 함"은 "치명적인 실패를 방지해야 함"을 의미합니다.).

  • QueryInterface를 통해 개체에서 액세스할 수 있는 인터페이스 집합은 동적이 아니라 정적이어야 합니다. 즉, 지정된 인터페이스에 대한 포인터에 대한 QueryInterface 호출이 처음으로 성공하면 다시 성공해야 합니다. 호출이 처음 실패하면 모든 후속 호출에서 실패해야 합니다.
  • 클라이언트가 개체의 인터페이스에 대한 포인터를 보유하고 클라이언트가 해당 인터페이스에 대해 쿼리하는 경우 호출이 성공해야 합니다.
  • 대칭이어야 합니다. 한 인터페이스에 대한 포인터를 가진 클라이언트가 다른 인터페이스에 대해 성공적으로 쿼리하는 경우 첫 번째 인터페이스에 대해 가져온 포인터를 통한 쿼리가 성공해야 합니다.
  • 한 인터페이스에 대한 포인터를 보유하는 클라이언트가 두 번째 인터페이스에 대한 포인터를 성공적으로 쿼리하고 해당 포인터를 통해 세 번째 인터페이스에 대해 성공적으로 쿼리하는 경우 세 번째 인터페이스에 대한 포인터를 통해 첫 번째 인터페이스에 대한 쿼리가 성공해야 합니다.

구현자에 대한 참고 사항

QueryInterface의 구현은 ACL을 검사 않아야 합니다. 이 규칙의 기본 이유는 COM에서 특정 인터페이스를 지원하는 개체가 해당 인터페이스에 대해 쿼리할 때 항상 성공을 반환해야 하기 때문입니다. 또 다른 이유는 QueryInterface 에서 ACL을 검사해도 특정 인터페이스에 대한 액세스 권한이 있는 클라이언트가 서버에 대한 호출 없이 다른 클라이언트에 직접 전달할 수 있기 때문에 실제 보안을 제공하지 않기 때문입니다. 또한 COM은 인터페이스 포인터를 캐시하기 때문에 클라이언트가 쿼리를 수행할 때마다 서버에서 QueryInterface 를 호출하지 않습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 unknwn.h

추가 정보