gpt4 book ai didi

c# - 在 C# 中使用 C++ 回调接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-03 16:55:42 25 4
gpt4 key购买 nike

我正在编写一个需要使用 DirectShow 录制视频的应用程序 - 为此,我正在使用互操作库 DirectShowLib,它似乎工作得很好。

但是,我现在需要在样本写入文件时获得回调通知,因此我可以添加数据单元扩展。根据 msdn 文档,在 C++ 中,这是通过实现 IAMWMBufferPassCallback 来完成的。接口(interface),并将结果对象传递给 SetNotify pin 的 IAMWMBufferPass 接口(interface)的方法。

因此,我创建了一个小类来实现 DirectShowLib 的 IAMWMBufferPassCallback 接口(interface):

 class IAMWMBufferPassCallbackImpl : IAMWMBufferPassCallback    
{
private RecordingPlayer player;

public IAMWMBufferPassCallbackImpl(RecordingPlayer player)
{
this.player = player;
}

public int Notify(INSSBuffer3 pNSSBuffer3, IPin pPin, long prtStart, long prtEnd)
{
if (player.bufferPin == pPin && !player.firstBufferHandled)
{
player.firstBufferHandled = true;

//do stuff with the buffer....
}

return 0;
}

}

然后我检索了所需 pin 的 IAMWMBufferPass 接口(interface),并将该类的实例传递给 SetNotify 方法:

bufferPassCallbackInterface = new IAMWMBufferPassCallbackImpl(this);

IAMWMBufferPass bPass = (IAMWMBufferPass)DSHelper.GetPin(pWMASFWriter, "Video Input 01");

hr = bPass.SetNotify(bufferPassCallbackInterface);
DsError.ThrowExceptionForHR(hr);

没有异常抛出,说明SetNotify方法成功。

现在的问题是,我的回调对象中的 Notify 方法从未被调用过。视频录制没有问题,除了回调根本没有被执行。

我进行互操作的方式有问题吗?

最佳答案

我通常在不安全的 C# 代码中使用函数指针的委托(delegate)。
唯一的技巧是您需要确保对委托(delegate)的引用不会被垃圾回收,因为在计算垃圾回收器内的引用时不使用不安全代码中的引用。因此,函数要么需要是静态的,要么持有引用的对象需要额外的人工引用以确保其可用性。
这是 tutorial for using delegates在 MSDN 上。

关于c# - 在 C# 中使用 C++ 回调接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2131964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com