2015-01-15 2 views
2

Итак, я смотрел этот примерный код для DirectShow.Net, в частности, их пример PlayCap в примере папки Capture. Вы можете скачать образцы here Его в C#. Он делает некоторые интересные вещи с приведением объектов к интерфейсам. Когда я попытался воссоздать его добросовестно в F #, объекты не будут отображаться должным образом.Проблемы с DirectShow.Net в F #

C#:

IVideoWindow videoWindow = null; 
    IMediaControl mediaControl = null; 
    IMediaEventEx mediaEventEx = null; 
    IGraphBuilder graphBuilder = null; 
    ICaptureGraphBuilder2 captureGraphBuilder = null; 

и затем в GetInterfaces():

 this.graphBuilder = (IGraphBuilder) new FilterGraph(); 
     this.captureGraphBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); 
     this.mediaControl = (IMediaControl) this.graphBuilder; 
     this.videoWindow = (IVideoWindow) this.graphBuilder; 
     this.mediaEventEx = (IMediaEventEx) this.graphBuilder; 

Так что я сделал для моего кода было это в F #:

let mutable videoWindow: IVideoWindow = null; 
    let mutable mediaControl: IMediaControl = null; 
    let mutable mediaEventEx: IMediaEventEx = null; 
    let mutable graphBuilder: IGraphBuilder = null; 
    let mutable captureGraphBuilder: ICaptureGraphBuilder2 = null; 

И позже в GetInterfaces()

 graphBuilder <- new FilterGraph() :> IGraphBuilder 
     captureGraphBuilder <- new CaptureGraphBuilder2() :> ICaptureGraphBuilder2 
     mediaControl <- graphBuilder :> IMediaControl; 
     videoWindow <- graphBuilder :> IVideoWindow; 
     mediaEventEx <- graphBuilder :> IMediaEventEx; 

Это было похоже на верный отдых. Даже не используя функциональный стиль. Я смотрел на msdn на кастинг в F #, чтобы посмотреть, правильно ли я делаю это. Похоже, что я, хотя у них есть 1 пример, и он невероятно минимальный по своей природе.

Проблема в том, я получаю ошибку:

Type constraint mismatch. The type 'FilterGraph' is not compatible with the type 'IGraphBuilder'

я получаю подобную ошибку для каждого из них. Я тоже опробовал downcasting, используя :?>

+1

Возможно, это Q [C# и F # литья - в частности, «как» ключевое слово] (http://stackoverflow.com/questions/2361851/c-sharp- и-f-casting-specific-the-as-keyword) имеет соответствующие ответы, так как вас интересует «COM-кастинг» через вызов COM 'QueryInterface'. –

ответ

2

Я столкнулся с подобной проблемой, оказалось, что в C# можно добавить атрибут GUID для интерфейса COM и реализации COM, и класс будет отображаться как действительный реализация интерфейса. Однако система типа F # более строгая и не допускает этого. Вы можете назначить их с помощью функции распаковывать как таковой

graphBuilder <- unbox (new FilterGraph()) 
captureGraphBuilder <- unbox (new CaptureGraphBuilder2()) 
+0

Я ценю ответ, чтобы я знал, как решить будущие проблемы этого типа. Но на данный момент я переключился на использование реализации DirectXOW.NET для захвата видео в Adorge, поскольку он намного проще и менее использует шаблонный код. –

Смежные вопросы