如何查询directshow接口

本文关键字:directshow 接口 查询 何查询 | 更新日期: 2023-09-27 18:02:03

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

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

filewriter = new FileWriter() as IBaseFilter;

但是如果没有c#定义的接口该怎么办呢?你必须自己创建一个吗?如果是:界面必须看起来如何?

更新:我尝试定义一个c#接口定义的建议由Roman R:

[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接口

接口以某种形式"存在",而不管它们在项目中的声明是否可用。也就是说,如果您没有定义某些接口,并且没有从第三方组件供应商处获得这些接口,也没有通过引用或类型库导入获得这些接口,那么您需要自己定义这些接口,以便您的定义与它们的原始定义相匹配。

与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);

乌利希期刊指南。正如CPlusSharp在下面的评论中所说,定义需要100%匹配。特别重要的是方法的顺序(而不是命名),以及使用的类型和约定。您的定义不匹配。