2011-11-13 6 views
0

방금 ​​DSPACK 구성 요소 라이브러리를 사용하는 Delphi 6 DirectShow 응용 프로그램의 "부실한"인터페이스 참조로 인해 발생한 긴 디버그 세션이있었습니다. 아시다시피 필터 그래프가 활성화되어있을 때 수행해야 할 작업과 필터 그래프를 비활성화해야 할 때 구성 요소 매개 변수를 완료해야하는 작업이 있습니다. 문제는 사용자가 초기화 된 값 (NIL이 아닌 할당 된 값)을 가지고 있지만 필터 그래프의 이전 구체화 중에 만들어 졌기 때문에 현재 필터 그래프 화신에 유효하지 않은 DirectShow 인터페이스 참조로 끝날 수 있다는 것입니다. 실수로 수행하는 것이 그리 쉽지는 않지만 필터 그래프를 켜고 끄고 "실시간"검색 작업과 오프라인 구성 작업간에 전환 할 수 있습니다. 오프라인 작업의 예는 다음에 그래프가 켜질 때 구체적인 필터 인스턴스를 생성 할 때 사용할 DSPACK 구성 요소 중 하나에 대한 Moniker를 설정하는 것입니다."오래된"DirectShow 인터페이스 참조를 보호하는 자동 방법이 있습니까?

예를 들어 필터 그래프를 처음 활성화 할 때 할당 한 IBaseFilter 참조를 가질 수 있으며 필터 그래프를 비활성화하고 다시 활성화 한 후에 다시 사용하려고했습니다. 인터페이스 그래프는, 필터 그래프의 현재의 구체화에는 속하지 않고, 이전의 인터페이스 그래프에 속하기 때문에, 인터페이스는 "stale"가되었습니다. 이로 인해 모든 종류의 이상하고 직관적이지 않은 DirectShow 오류 메시지가 나타나지만 실제로는 인터페이스 참조가 오래되어서 발생합니다.

관례에 따라 또는 DirectShow 스마트 포인터와 같은 현명한 솔루션으로 필터 그래프의 수명이 다한 것을 방지하기 위해 누군가가 방법을 제안 했습니까? 아니면 인터페이스 참조 사용에 대해 끊임없이주의해야 할 유일한 해결책입니까?

답변

1

필터 개발자는 필터가 일부 처리 요청을 받았을 때 필터가 이미 그래프에서 제거되었거나 상태가 변경된 것으로 나타나는 경우 오류 코드를 반환합니다.

응용 프로그램 측면에서 모든 종류의 sychnronization을 구현하여 작동이 종료되었음을 나타낼 수 있습니다. 예를 들어, 필터 그래프를 중지/해제하기 전에 종결 플래그 (부울 변수)를 설정할 수 있습니다. 처리가 늦어지고 동기화가 필요한 일종의 처리 콜백에서 플래그를 확인하면 처리를 중단 할 시간을 알 수 있습니다 뛰어난 해지 요청으로 인해