首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在directshow.net中查询directshow接口?

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

Stack Overflow用户
提问于 2014-05-07 11:44:53
回答 1查看 765关注 0票数 0

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

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

代码语言:javascript
复制
filewriter = new FileWriter() as IBaseFilter;

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

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

代码语言:javascript
复制
[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++中的过滤器定义:

代码语言:javascript
复制
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#中的接口定义必须不正确。但我不知道该怎么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-07 12:11:31

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

同样的方式,DirectShow.NET定义了您需要的接口,并且您没有现成的.NET代码可用,例如在QEdit.cs

代码语言:javascript
复制
[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%匹配。特别重要的是方法的顺序(相对于命名),以及使用的类型和约定。你的定义不太匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23516912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档