【发布时间】:2015-01-15 06:10:14
【问题描述】:
所以我正在查看 DirectShow.Net 的示例代码,特别是 Capture 文件夹示例下的 PlayCap 示例。您可以下载示例here 它的 C# 格式。它通过将对象转换为接口做了一些有趣的事情。当我尝试在 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 个例子,而且它在本质上非常少。
问题是我得到了错误:
类型约束不匹配。
'FilterGraph'类型与'IGraphBuilder'类型不兼容
我得到每个类似的错误。我也尝试过使用:?>
【问题讨论】:
-
也许这个 Q C# and F# casting - specifically the 'as' keyword 有相关的答案,因为您对通过底层 COM
QueryInterface调用的“COM 转换”感兴趣。
标签: f# directshow.net c#-to-f#