How to call this dialog using Directshow.net?
Asked
Active
Viewed 3,172 times
2 Answers
6
Something like this would work, assuming you have an IBaseFilter reference:
[DllImport("oleaut32.dll", CharSet = CharSet.Auto)]
internal static extern int OleCreatePropertyFrame(
IntPtr hwndOwner,
uint x, uint y,
[MarshalAs(UnmanagedType.LPWStr)]
string caption,
uint objectCount,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown)]
object[] lplpUnk,
int cPages,
IntPtr pageClsID,
Guid lcid,
uint dwReserved,
IntPtr lpvReserved);
public void DisplayPropertyPages(Form form, IBaseFilter filter)
{
var propertyPages = filter as ISpecifyPropertyPages;
DsCAUUID pages;
FilterInfo info;
int hr = filter.QueryFilterInfo(out info);
DsError.ThrowExceptionForHR(hr);
if (propertyPages == null)
{
throw new ApplicationException("IBaseFilter doesn't implement ISpecifyPropertyPages");
}
hr = propertyPages.GetPages(out pages);
DsError.ThrowExceptionForHR(hr);
var filters = new IBaseFilter[1];
filters[0] = filter;
hr = OleCreatePropertyFrame(form.Handle, 0, 0, info.achName, 1, filters,
pages.cElems, pages.pElems, Guid.Empty, 0, IntPtr.Zero);
Marshal.FreeCoTaskMem(pages.pElems);
DsError.ThrowExceptionForHR(hr);
}

Davide Piras
- 43,984
- 10
- 98
- 147

David Paxson
- 553
- 1
- 3
- 8
-
Yes this would work. You have this code in `Samples\Misc\Toolkit\FilterGraphTools.cs` file in DirectShow.NET samples (http://sourceforge.net/projects/directshownet/files/DirectShowSamples/). But if you don't understand this code, try to see how DirectShow works! In these samples compile and run `Samples\Players\PlayWnd` project and explore the code... – Cipi Mar 10 '11 at 09:44
0
Please, check description of OleCreatePropertyFrame() in MSDN.
Guid lcid is invalid. Result:
Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'D:\CVS\Dev\Filters\H264\H264mfxEncoder\Samples\C#\H264EncoderTest\bin\Debug\H264EncoderTest.vshost.exe'.
Additional Information: A call to PInvoke function 'H264EncoderTest!H264EncoderTest.CGraph::OleCreatePropertyFrame' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
Must be:
uint lcid and hr = OleCreatePropertyFrame(form.Handle, 0, 0, info.achName, 1, filters, pages.cElems, pages.pElems, 0, 0, IntPtr.Zero);

Redoman
- 3,059
- 3
- 34
- 62

Dmitry Nikitin
- 99
- 1
- 2