2010-05-10 4 views
1

DirectShow 샘플 문서에서 ezrgb24 필터를 확장하여 만든 사용자 지정 DirectShow 필터가 있습니다.C에서 DirectShow 필터를 참조 할 때의 문제가 발생했습니다.

제 3 자 멀티미디어 SDK (LeadTools)를 통해이 필터를 간접적으로 C#에서 사용하고 있습니다. 이제 필터의 DLL에 대한 참조를 프로젝트에 추가하여 SDK가 검색 한 IUnknown 인터페이스를 필터의 자체 사용자 인터페이스에 캐스팅 할 수 있도록해야합니다.

추가 참조 -> 찾아보기 및 명령 줄에서 직접 tlbimp를 사용하여 DLL 참조를 추가하려고했습니다. 두 방법 모두 'C : \ windows \ system32 \ ezrgb24.dll'오류가 유효한 형식 라이브러리가 아닙니다.

내가 누락 된 항목이 있습니까? 내가 ezrgb24 예제를 만들었던 확장 기능은 구조적으로 매우 사소한 것입니다.

모든 도움을 주시면 대단히 감사하겠습니다.

토니.

답변

2

C#으로 인터페이스를 작성하고 ComImport 특성을 사용해야합니다. 예를 들어 SDK에서 샘플 필터가

[ComImport, 
InterfaceType(ComInterfaceType.InterfaceIsIUnknown), 
Guid("fd5010a3-8ebe-11ce-8183-00aa00577da1")] //guid defined for interface in example code 
public interface IIPEffect 
{ 
    [PreserveSig] 
    int get_IPEffect(out int effectTime, out double startTime, out double length); 

    [PreserveSig] 
    int set_IPEffect(int effectNum, double startTime, double length); 
} 

는 이제 인터페이스 정의는 방법입니다 사용할 수 있습니다 보일 것

//find IBaseFilter somehow 
var effectFilter = FindFilter() as IIPEffect; 
effectFilter.set_IPEffect(0, 0, 20); 

참고 : 길이와 startTime을위한 매개 변수로 REFTIME 유형이 인터페이스 정의에 있지만, 그것은 단순한 typedef이므로 우리 코드에서는 double입니다. 인터페이스 정의를 C#으로 변환하는 방법에 대한 자세한 내용은 marshaling msdn의 문서를 참조하십시오.

+0

감사합니다.이 메서드는 내 용도로 훌륭하게 작동했습니다. –

+0

dll이 regsvr32를 사용하여 등록 된 경우이 작업이 필요합니까? 왜냐하면 나는 set_IPEffect를 호출하려고하고 나에게 예외를 던졌습니다. 이 오래된 대답은 미안하지만 조언이 필요합니다. – cmario

+0

예, 작동합니다. 어떤 종류의 예외가 발생합니까? – Yurec

1

표준 DirectShow 필터 샘플은 IDispatch 호환 인터페이스를 구현하지 않습니다. 또한이 dll에는 형식 라이브러리가 없습니다. 자신 만의 타입 라이브러리 인터페이스를 구현해야합니다.

ATL을 사용하여이 작업을 수행 할 수 있습니다.

관련 문제