2017-12-01 36 views
-1

Windows API에서 하나 이상의 COM 인터페이스를 사용하는 C++ 클래스를 작성했습니다. 분명히 클래스 내부에서 이러한 객체를 사용할 때 AddRef()Release()을 올바르게 호출해야합니다.클래스에서 IUnknown을 구현하는시기

내 질문은 ... IUnknown을 C++ 클래스 자체에 추가로 구현해야합니까? 내 이해는 내가 사용하고있는 인터페이스가 비동기 작업이나 콜백을 수행하는 경우에만 수행하면된다는 것입니다. 이 경우 비동기 작업이나 콜백이 완료되면 C++ 클래스 자체가 "활성"상태인지 확인해야합니다. 이 올바른지?

명확한 설명을 위해 (그리고 Hans의 의견에 따라) 관심있는 특정 인터페이스는 IMFSourceReader (Windows Media Foundation)입니다. 이 인터페이스의 기본값은 동기 모드입니다. 다시 말하지만, 정확하게 이것을 이해한다면, 비동기 모드에서 대신 사용할 경우에만 IUnknown을 C++ 클래스에 구현하면됩니다. 그렇지 않으면 IMFSourceReader->AddRef() 또는 IMFSourceReader->Release으로 전화하면 충분합니다.

그러나 비동기 모드에서 IMFSourceReader을 사용하려면 IMFSourceReaderCallback 인터페이스가 필요하며 그 자체는 IUnknown을 상속합니다. 이 경우 클래스에서 구현해야합니다.

내 이해가 정확합니까? 아직 구현을 작성하는 초기 단계에 있으므로 공유 할 예제 코드가 실제로 없습니다. 이 시점에서 나는 단지 내 수업의 아주 기본적인 구조를 내려 놓으려고 노력하고있다.

+0

이미 [How IUnknown Works] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd388915(v=vs.85).aspx)를 읽으셨습니까? – user0042

+2

Windows에서 구현 한 COM 인터페이스라면 분명히 모호한 질문을하지 않아도됩니다. 매뉴얼을 요구하지 말고, 당신이하려는 것을 보여주십시오. –

+0

팁 :'AddRef()'와'Release()'호출을 적절히하기 위해 래퍼 클래스와 같은 스마트 포인터를 구현하는 것이 좋습니다. (여기 [http://loki-lib.sourceforge.net/html /a00045.html) 참조). – user0042

답변

3

COM 개체를 직접 구현하는 경우 IUnknown 만 구현하면 COM을 사용하면 IUnknown을 구현할 필요가 없습니다.

+0

고마워요! 이것은 내가 찾고 있었던 바로 그 것이었다. 나는 그것이 사실이라고 생각했다. 그러나 COM에 대한 나의 연구는 아직 초기 단계이기 때문에 나는 확신하고 싶었다. –

+0

그냥 추가하려면 소비하는 COM 개체도 IConnectionPointContainer를 통해 이벤트를 노출하고 이벤트 싱크가있는 이벤트를 구독하려는 경우 COM 개체 (이벤트 싱크)를 강제로 구현해야합니다. 그렇게하기 위해서. – Joe

관련 문제