在c++中,您可以调用filters queryinterface方法来获取过滤器的另一个接口。如何在DirectShow.net中做到这一点?
好吧,我发现你可以这样做:
filewriter = new FileWriter() as IBaseFilter;但是,如果没有在c#中定义的接口,该怎么办?你必须自己创造一个吗?如果是的话:界面应该怎么看?
更新:我尝试按照Roman的建议定义一个c#接口定义:
[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#中的接口定义必须不正确。但我不知道该怎么做。
发布于 2014-05-07 12:11:31
接口以某种形式“存在”,而不管它们在项目中声明的可用性。也就是说,如果您没有定义特定的接口,并且没有来自第三方组件供应商的接口,也没有通过引用或类型库导入获得它们,那么您需要自己定义这些接口,以便您的定义与它们的原始定义相匹配。
同样的方式,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%匹配。特别重要的是方法的顺序(相对于命名),以及使用的类型和约定。你的定义不太匹配。
https://stackoverflow.com/questions/23516912
复制相似问题