>

이 C ++/COM 셸 확장 튜토리얼에서 프로그래머는 (목적으로) QueryInterface() 에 전화하는 것을 포기할 수있는  대신 일반 객체를 전달하십시오. 적어도 DllGetClassObject() 를 구현할 때 작동합니다. . 그는 QueryInterface() 의 목적을 말한다  주어진 인터페이스를 지원하는지 여부에 대해 각 객체가 스스로 설명하도록하는 것입니다.

마이크로 소프트는 말  객체의 특정 인터페이스에 대한 포인터를 가져 오는 데 필요합니다.

QueryInterface() 는 어느 정도까지  필요한? QueryInterface() 에 전화 할 때가 있습니까  절대적으로 필수적이며 코드가 없으면 코드가 작동하지 않습니까? 아니면 비디오 자습서에서 제안한 것처럼 객체 자체가 기술적으로 충분합니까?

QueryInterface()
  • 답변 # 1

    아니요, 일반적으로 QueryInterface 호출을 건너 뛸 수 없습니다  사용중인 인터페이스 포인터를 이미 알고 있지 않으면

    IFoo 및 IBar를 구현하는 객체를 상상하면 레이아웃은 다음과 같습니다.

    VT
      IFoo_QueryInterface(...)
      IFoo_AddRef()
      IFoo_Release()
      IFoo_FooFight(int, int)
    VT
      IBar_QueryInterface(...)
      IBar_AddRef()
      IBar_Release()
      IBar_BarBarBar(int)
    
    

    객체의 인스턴스가 IFoo 를 가리킬 수 있습니다 v 테이블 포인터 또는 IBar v 테이블 포인터. 매개 변수 개수가 같지 않기 때문에 실제로 어떤 메서드인지 모른 채 네 번째 메서드를 호출하면 충돌이 발생합니다. 서명이 동일하더라도 임의의 메서드를 호출하는 것은 좋지 않습니다.

    DllGetClassObject 의 발신자 때문에 귀하가 언급 한 동영상이 사라집니다.  보통 IClassFactory 만 요청하십시오 . 그러나 누군가가 IClassFactory2 를 요청할 수 있기 때문에 안전하지 않습니다.  대신에. 올바른 DllGetClassObject  따라서 구현은 또한 QueryInterface 를 호출해야합니다 .

    COM 기초를 배울 때 C ++ 대신 C로 코딩하는 것이 좋습니다. 이렇게하면 모든 v-table 간접 처리를 직접 수행해야합니다. 자세한 내용은이 시리즈를 참조하십시오.

  • 이전 wordpress - 프로그래밍 방식으로 모든 제품 카테고리를 모든 제품에 할당
  • 다음 Ubuntu 18 - 우분투 18 - 넷 플랜 :cloudcfg 비활성화 문제