簡體   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