2009-09-22 8 views
2

나는 C가있는 경우 ++ 클래스는 COM 인터페이스 IY 및 IZ를 구현하고, 나는 타입 X의 객체의 IY 인터페이스의 포인터의 Y를 가지고 있고, 나는이 할 X :COM 개체에 대한 COM 개체의 dynamic_cast가 참조 횟수를 높이 지 않습니다. 그렇습니까?

IZ *z = dynamic_cast<IZ *> (y); 

을 그 객체의 참조 횟수를 높이 지 않습니다. 그렇습니까? 그것을 설명하기 위해 Release()를 할 필요는 없다.

중요한 경우 ATL/COM을 사용하고 있습니다.

나는 대답을 추측하고 있습니다. "아니요. 참조 횟수를 늘리지는 않았고 출시 할 필요가 없습니다."하지만 확실하게 알고 싶습니다.

미리 감사드립니다.

답변

3

가 증가합니다 refcounter하지 않습니다(). QueryInterface()는 새로운 인터페이스 포인터를 제공하기 때문에 COM 규칙에 따라 내부적으로 AddRef()를 호출합니다.

게시 된 코드에서 AddRef()를 호출하지 않고 AddRef()를 호출 할 수있는 함수를 호출하지 않아서 참조 횟수가 증가한다고 생각하십니까?

ATL/MFC가 뇌에 어떤 영향을 미치지 만, 관련된 마법은 없습니다. 의심 스러울 때, 당신은 언제나 VS에서 해체를 볼 수 있고, 으로 AddRef()가 호출되지 않는다는 것을 증명합니다.

편집 : 나는 Dewfy가 말한 것을 되풀이하고 싶습니다. . QueryInterface()를 사용하십시오. 또는 CComQIPtr <> (꼭해야하는 경우).

또한 편집 : 당신이 CComPtr <>과 CComQIPtr <를 사용하는 경우> 다음 릴리스를 호출 할 필요가 없습니다()와 적절한 심판이 카운트를 파악하는 부담의 정도가 완화된다. 당신은 정말로 그들을 사용하는 것을 고려해야합니다.

4

dynamic_cast는 여러 이유에 사용할 수 없습니다 : 대상

  • 당신이 확실하지 않은 OLE 당신을 위해 프록시를 생성하지 않는 경우
  • ...
  • RTTI를 지원하는 경우

    • 당신이 모르는

    대신 QueryInterface를 사용하십시오. 원하는대로 할 수 있습니다.

    확실 위의 문제의 경우에도 - 주조 변경 누군가의 IUnknown :: AddRef에를 호출 할 때 COM 개체에 대한 참조 카운트

    +1

    예, 예 그래 다시. 구현이 실제로 C++인지 여부는 알 수 없습니다. 대한 QueryInterface()를 사용 -에 관계없이 다른 상호 운용성 문제의 작동 dynamic_cast는 매우 가까운 해당합니다. – sharptooth

    0

    C++ 빌더에서 COM 인터페이스 포인터의 dynamic_cast은 실제로 QueryInterface입니다. 반환 된 포인터는 QI가 성공하면 AddRef 'd가됩니다.

    COM 개체를 구현하는 클래스는보다 일반적인 C++ 클래스와 다른 vtable 레이아웃을 가지므로 C++ 스타일 dynamic_cast은 작동하지 않습니다. 그래서 나는 이것이 C++ Builder가 QueryInterface를하는 더 현명한 일을한다고 생각합니다.

    (원래 COM의 개념은 C++ 개체 모델을 언어에 구애받지 않고 바이너리 표준으로 일반화하여 dynamic_cast의 이름을 QueryInterface로 변경 한 것입니다.)dynamic_cast는이 정의되지 않은 동작이 발생하는 경우

    나는, 상단 대답은 MSVC를 참조한다 같아요.