public static IBaseFilter AddFilterByDevicePath(IGraphBuilder graphBuilder, string devicePath, string name)
{
int hr = 0;
IBaseFilter filter;
UCOMIBindCtx bindCtx;
UCOMIMoniker moniker;
int eaten;
hr = NativeMethods.CreateBindCtx(0, out bindCtx);
Marshal.ThrowExceptionForHR(hr);
hr = NativeMethods.MkParseDisplayName(bindCtx, devicePath, out eaten, out moniker);
Marshal.ThrowExceptionForHR(hr);
hr = (graphBuilder as IFilterGraph2).AddSourceFilterForMoniker(moniker, bindCtx, name, out filter);
DsError.ThrowExceptionForHR(hr);
Marshal.ReleaseComObject(bindCtx);
Marshal.ReleaseComObject(moniker);
return filter;
}
{
int hr = 0;
IBaseFilter filter;
UCOMIBindCtx bindCtx;
UCOMIMoniker moniker;
int eaten;
hr = NativeMethods.CreateBindCtx(0, out bindCtx);
Marshal.ThrowExceptionForHR(hr);
hr = NativeMethods.MkParseDisplayName(bindCtx, devicePath, out eaten, out moniker);
Marshal.ThrowExceptionForHR(hr);
hr = (graphBuilder as IFilterGraph2).AddSourceFilterForMoniker(moniker, bindCtx, name, out filter);
DsError.ThrowExceptionForHR(hr);
Marshal.ReleaseComObject(bindCtx);
Marshal.ReleaseComObject(moniker);
return filter;
}
很简单.需要手工加入CreateBindCtx和MkParseDisplayName这两个API函数(ole32.dll)
[DllImport("ole32.dll")]
public static extern int CreateBindCtx(int reserved, out UCOMIBindCtx ppbc);
[DllImport("ole32.dll")]
public static extern int MkParseDisplayName(UCOMIBindCtx pcb, [MarshalAs(UnmanagedType.LPWStr)] string szUserName, out int pchEaten, out UCOMIMoniker ppmk);
public static extern int CreateBindCtx(int reserved, out UCOMIBindCtx ppbc);
[DllImport("ole32.dll")]
public static extern int MkParseDisplayName(UCOMIBindCtx pcb, [MarshalAs(UnmanagedType.LPWStr)] string szUserName, out int pchEaten, out UCOMIMoniker ppmk);