繁体   English   中英

如何在directshow.net中查询directshow接口?

[英]How to query directshow interface in directshow.net?

在c ++中,您调用过滤器queryinterface方法来获取过滤器的另一个接口。 你是如何在DirectShow.net中做到这一点的?

好的,我发现你可以这样做:

filewriter = new FileWriter() as IBaseFilter;

但是如果你没有在c#中定义的接口该怎么办? 你自己要创造一个吗? 如果是:界面如何看?

更新:我尝试按照罗马R的建议定义ac#接口定义:

[ComImport, System.Security.SuppressUnmanagedCodeSecurity,
Guid("21337C80-1D52-44FD-8581-85ED4BBC2FA9"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyFilter
{
    [PreserveSig]
    int SetIntroText(
        [In, MarshalAs(UnmanagedType.LPWStr)] String text);
    [PreserveSig]
    int SetIntervalText(
        [In, MarshalAs(UnmanagedType.LPWStr)] String text);

 }

转换工作正常但调用方法始终返回0并且不执行任何操作,因此不会调用过滤器的实际方法。

这是c ++中的过滤器定义:

static const GUID CLSID_MyFilter64  = 
{ 0x67216de, 0xe6a1, 0x49c9, { 0xa0, 0x16, 0x7, 0x46, 0x24, 0xc2, 0xf, 0xe5 } };


// {21337C80-1D52-44FD-8581-85ED4BBC2FA9}
static const GUID IID_IMyFilter64 = 
{ 0x21337c80, 0x1d52, 0x44fd, { 0x85, 0x81, 0x85, 0xed, 0x4b, 0xbc, 0x2f, 0xa9 } };






DECLARE_INTERFACE_(IMyFilter, IUnknown)
{

    STDMETHOD(GetThePinCount)(int*) PURE;
    STDMETHOD_(IPin*, GetMyPin(int index)) PURE;
    STDMETHOD(GetMediaTypeArgs)(VIDEOINFOHEADER **hdr, int &stride, Gdiplus::PixelFormat** pxFmt)PURE;
    STDMETHOD(SetMediaTypeArgs)(VIDEOINFOHEADER *hdr, int stride, Gdiplus::PixelFormat* pxFmt)PURE;

    STDMETHOD(SetIntroText)(WCHAR* text);
    STDMETHOD_(WCHAR*, GetIntroTExt)()PURE;
    STDMETHOD(SetIntervalText)(WCHAR* text)PURE;
    STDMETHOD_(WCHAR*, GetIntervalText)()PURE;
};

我不知道为什么它不起作用。 c#中的接口定义必须不正确。 但我不知道应该如何。

无论项目中的声明是否可用,接口都以某种形式“存在”。 也就是说,如果您没有定义某些接口,然后您没有来自第三方组件供应商,并且您没有通过引用或类型库导入它们 - 那么您需要自己定义,以便您的定义与其原始定义相匹配。

同样,DirectShow.NET定义了您需要的接口,并且您没有开箱即用的.NET代码,例如在QEdit.cs中

[ComImport, System.Security.SuppressUnmanagedCodeSecurity,
Guid("6B652FFF-11FE-4fce-92AD-0266B5D7C78F"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ISampleGrabber
{
    [PreserveSig]
    int SetOneShot(
        [In, MarshalAs(UnmanagedType.Bool)] bool OneShot);

    [PreserveSig]
    int SetMediaType(
        [In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt);

UPD。 正如CPlusSharp在下面的评论中所说,定义必须是100%匹配。 特别重要的是方法的顺序(与命名相反),以及使用的类型和约定。 你的定义不是很好的匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM