2010-06-11 3 views
2

이 예제를 기반으로 내 직접 쇼 그래프에 샘플 그래버를 연결했습니다. http://msdn.microsoft.com/en-us/library/dd407288(VS.85).aspx 문제는 단발과 버퍼를 사용한다는 것입니다. 지속적으로 샘플을 가져오고 싶습니다. 샘플보다는 폴링을하는 것보다 콜백을 사용하고 싶습니다.C++ directshow 샘플 그래버로 콜백 메서드를 사용하는 방법

어떻게 SetCallback 메서드를 사용합니까?

SetCallback(ISampleGrabberCB *pCallback, long WhichMethodToCallback) 

어떻게 내 자신의 방법으로 pCallback을 가리 킵니까?

+1

안녕하세요, 정확한 문제는 그래서 당신은 샘플을 잡는의 전체 코드를 공유하시기 바랍니다 수있는 클래스 구현 ISampleGrabberCB의 예입니다 ? 고마워요, – Basel

+0

그래, 만약 그 코드가 작동한다면, 제발 그걸 나누시겠습니까? – mbaros

답변

2

저는 C# 배경에서 왔으며 어떤 수준에서는 메서드에 대한 참조를 전달할 수 있다고 생각했습니다. 이것은 대수롭지 않은 것 같습니다. 대신 호출 할 메소드를 정의하는 인터페이스를 구현하는 클래스를 작성해야합니다. 그런 다음 클래스의 인스턴스를 SetCallback 메서드의 필터에 전달합니다. 물론 긴 대리자 또는 람다 식 여기

에 비해 숨이 찬 보인다는

class SampleGrabberCallback : public ISampleGrabberCB 
{ 
public: 
    // Fake referance counting. 
    STDMETHODIMP_(ULONG) AddRef() { return 1; } 
    STDMETHODIMP_(ULONG) Release() { return 2; } 

    STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) 
    { 
     if (NULL == ppvObject) return E_POINTER; 
     if (riid == __uuidof(IUnknown)) 
     { 
      *ppvObject = static_cast<IUnknown*>(this); 
      return S_OK; 
     } 
     if (riid == __uuidof(ISampleGrabberCB)) 
     { 
      *ppvObject = static_cast<ISampleGrabberCB*>(this); 
      return S_OK; 
     } 
     return E_NOTIMPL; 
    } 

    STDMETHODIMP SampleCB(double Time, IMediaSample *pSample) 
    { 
     return E_NOTIMPL; 
    } 

    STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen) 
    { 
     return E_NOTIMPL;  
    } 
}; 
+0

이것이 방법입니다. (아마도 참조 계산을 구현 ..),하지만이 작동합니다. – Christopher

+0

참조 카운팅을 처리합니다. 왜 중요 함? 내가하지 않으면 끔찍한 일이 일어날까요? –

+0

참조 카운팅 기능은 클래스가 올바른 시간에 삭제되도록하는 COM 표준 방법입니다. MS baseclasses 샘플 프로젝트의 CUnknown에서 상속 받아 올바르게 구현할 수 있습니다. – Alan

관련 문제