关于IDL文件内容转换为c#接口的问题。 错误信息如下:其他信息: 接口 DShow.IVMRImagePresenterConfig 的 QueryInterface 失败。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我反编译出DirectShowLib的这部分代码是这样:[ComImport, Guid("9F3A1C85-8555-49BA-935F-BE5B5B29D178"), InterfaceType(1)]public interface IVMRImagePresenterConfig{ [MethodImpl(3 | ((int) MethodImplOptions.InternalCall))] void SetRenderingPrefs([In] uint dwRenderFlags); [MethodImpl(3 | ((int) MethodImplOptions.InternalCall))] void GetRenderingPrefs(out uint dwRenderFlags);}[ComImport, ComConversionLoss, InterfaceType(1), Guid("E6F7CE40-4673-44F1-8F77-5499D68CB4EA")]public interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig{ [MethodImpl(3 | ((int) MethodImplOptions.InternalCall))] void SetRenderingPrefs([In] uint dwRenderFlags); [MethodImpl(3 | ((int) MethodImplOptions.InternalCall))] void GetRenderingPrefs(out uint dwRenderFlags); [MethodImpl(3 | ((int) MethodImplOptions.InternalCall))] void SetXlcModeDDObjAndPrimarySurface([In] ref uint lpDDObj, [In] ref uint lpPrimarySurf); [MethodImpl(3 | ((int) MethodImplOptions.InternalCall))] void GetXlcModeDDObjAndPrimarySurface([Out] IntPtr lpDDObj, [Out] IntPtr lpPrimarySurf);} 而我写的代码反编译出来是这样:[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(true), Guid("9f3a1c85-8555-49ba-935f-be5b5b29d178")]public interface IVMRImagePresenterConfig{ [PreserveSig] int SetRenderingPrefs([In] int dwRenderFlags); [PreserveSig] int GetRenderingPrefs(out int dwRenderFlags);}[ComImport, ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e6f7ce40-4673-44f1-8f77-5499d68cb4ea")]public interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig{ [PreserveSig] int SetXlcModeDDObjAndPrimarySurface([In] object lpDDObj, [In] object lpPrimarySurf); [PreserveSig] int GetXlcModeDDObjAndPrimarySurface(out object lpDDObj, out object lpPrimarySurf);} 最大差别就是我的IVMRImagePresenterExclModeConfig 里面没有列出IVMRImagePresenterConfig中的方法。大家看看我应该怎么做。本来想用DirectShow的,但是传递DirectDraw.device他用的是ref uint类型,我不知道怎么传递进去。 上面是我反编译出来的代码,我写的代码是 #region IVMRImagePresenterConfig [ComVisible(true), ComImport, Guid("9f3a1c85-8555-49ba-935f-be5b5b29d178"), InterfaceType(1)]// ComInterfaceType.InterfaceIsIUnknown )] public interface IVMRImagePresenterConfig { [PreserveSig] int SetRenderingPrefs([In] uint dwRenderFlags); [PreserveSig] int GetRenderingPrefs([Out] out uint dwRenderFlags); }; #endregion #region IVMRImagePresenterExclModeConfig [ComVisible(true), ComImport,//ComConversionLoss, Guid("e6f7ce40-4673-44f1-8f77-5499d68cb4ea"), InterfaceType( 1)]//ComInterfaceType.InterfaceIsIUnknown )] public interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig { [PreserveSig] int SetXlcModeDDObjAndPrimarySurface([In] object lpDDObj,[In] object lpPrimarySurf); [PreserveSig] int GetXlcModeDDObjAndPrimarySurface([Out] out object lpDDObj,[Out] out object lpPrimarySurf); }; #endregion调用代码:IVMRImagePresenterExclModeConfig ipemc=(IVMRImagePresenterExclModeConfig)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID.AllocPresenterDDXclMode)); hr=ipemc.SetXlcModeDDObjAndPrimarySurface(device,surface1); Debug.WriteLine("SetXlcModeDDObjAndPrimarySurface hr="+hr); hr=ipemc.SetRenderingPrefs(0); Debug.WriteLine("SetRenderingPrefs hr="+hr); IVMRWindowlessControl wc=(IVMRWindowlessControl)ipemc; wc.SetVideoClippingWindow(this.Handle);现在调用到:hr=ipemc.SetRenderingPrefs(0);就说:接口 DShow.IVMRImagePresenterConfig 的 QueryInterface 失败。 参考--COM组件对象与.NET类对象的相互转换:http://comcamp.myrice.com/techarticles/com/2013.htm http://blog.csdn.net/xxcc/archive/2001/10/18/7283.aspx cancersyf(fengzhimei) 这篇文章好像是跟我问的这个没有大关系呀。:) hivak47(比尔) 您这个和 cancersyf(fengzhimei) 是一篇文章:) 网站爬虫,纠结中………… 串口通讯如何发16进制的控制指令 DBHelper(连接数据库的类)类型初始值设定项引发异常,求助!!! 初学者的小问题. 如何实现点打印后立即进行打印,而不需要出现选择打印机的窗口 请教一个自动生成编号的问题!!! 中文名称存储过程引发的麻烦 有关Dropdownlist的小问题,怎么设置高度? c#中如何执行下列SQL语句?谢谢。 如何将 数据 放到DataGrid中? 为什么没有System.Service这个命名空间?? 怎样把Crystal Report下生成的PDF文件,转换成EXCEL格式的文件!~~???
public interface IVMRImagePresenterConfig
{
[MethodImpl(3 | ((int) MethodImplOptions.InternalCall))]
void SetRenderingPrefs([In] uint dwRenderFlags);
[MethodImpl(3 | ((int) MethodImplOptions.InternalCall))]
void GetRenderingPrefs(out uint dwRenderFlags);
}
[ComImport, ComConversionLoss, InterfaceType(1), Guid("E6F7CE40-4673-44F1-8F77-5499D68CB4EA")]
public interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig
{
[MethodImpl(3 | ((int) MethodImplOptions.InternalCall))]
void SetRenderingPrefs([In] uint dwRenderFlags);
[MethodImpl(3 | ((int) MethodImplOptions.InternalCall))]
void GetRenderingPrefs(out uint dwRenderFlags);
[MethodImpl(3 | ((int) MethodImplOptions.InternalCall))]
void SetXlcModeDDObjAndPrimarySurface([In] ref uint lpDDObj, [In] ref uint lpPrimarySurf);
[MethodImpl(3 | ((int) MethodImplOptions.InternalCall))]
void GetXlcModeDDObjAndPrimarySurface([Out] IntPtr lpDDObj, [Out] IntPtr lpPrimarySurf);
}
而我写的代码反编译出来是这样:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(true), Guid("9f3a1c85-8555-49ba-935f-be5b5b29d178")]
public interface IVMRImagePresenterConfig
{
[PreserveSig]
int SetRenderingPrefs([In] int dwRenderFlags);
[PreserveSig]
int GetRenderingPrefs(out int dwRenderFlags);
}
[ComImport, ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e6f7ce40-4673-44f1-8f77-5499d68cb4ea")]
public interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig
{
[PreserveSig]
int SetXlcModeDDObjAndPrimarySurface([In] object lpDDObj, [In] object lpPrimarySurf);
[PreserveSig]
int GetXlcModeDDObjAndPrimarySurface(out object lpDDObj, out object lpPrimarySurf);
}
最大差别就是我的IVMRImagePresenterExclModeConfig 里面没有列出IVMRImagePresenterConfig中的方法。
大家看看我应该怎么做。本来想用DirectShow的,但是传递DirectDraw.device他用的是ref uint类型,我不知道怎么传递进去。
[ComVisible(true), ComImport,
Guid("9f3a1c85-8555-49ba-935f-be5b5b29d178"),
InterfaceType(1)]// ComInterfaceType.InterfaceIsIUnknown )]
public interface IVMRImagePresenterConfig
{
[PreserveSig]
int SetRenderingPrefs([In] uint dwRenderFlags); [PreserveSig]
int GetRenderingPrefs([Out] out uint dwRenderFlags);
};
#endregion #region IVMRImagePresenterExclModeConfig
[ComVisible(true), ComImport,//ComConversionLoss,
Guid("e6f7ce40-4673-44f1-8f77-5499d68cb4ea"),
InterfaceType( 1)]//ComInterfaceType.InterfaceIsIUnknown )]
public interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig
{ [PreserveSig]
int SetXlcModeDDObjAndPrimarySurface([In] object lpDDObj,[In] object lpPrimarySurf); [PreserveSig]
int GetXlcModeDDObjAndPrimarySurface([Out] out object lpDDObj,[Out] out object lpPrimarySurf);
};
#endregion调用代码:
IVMRImagePresenterExclModeConfig ipemc=(IVMRImagePresenterExclModeConfig)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID.AllocPresenterDDXclMode));
hr=ipemc.SetXlcModeDDObjAndPrimarySurface(device,surface1);
Debug.WriteLine("SetXlcModeDDObjAndPrimarySurface hr="+hr);
hr=ipemc.SetRenderingPrefs(0);
Debug.WriteLine("SetRenderingPrefs hr="+hr);
IVMRWindowlessControl wc=(IVMRWindowlessControl)ipemc;
wc.SetVideoClippingWindow(this.Handle);现在调用到:hr=ipemc.SetRenderingPrefs(0);
就说:接口 DShow.IVMRImagePresenterConfig 的 QueryInterface 失败。
http://comcamp.myrice.com/techarticles/com/2013.htm
这篇文章好像是跟我问的这个没有大关系呀。:)