2011-01-21 20 views

回答

5

像這樣的工作,假設你有一個IBaseFilter參考:

[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); 
    } 
+0

是的,這將工作。您在DirectShow.NET示例(http://sourceforge.net/projects/directshownet/files/DirectShowSamples/)中的Samples \ Misc \ Toolkit \ FilterGraphTools.cs`文件中包含此代碼。但是如果你不明白這個代碼,試着看看DirectShow是如何工作的!在這些示例中,編譯並運行`Samples \ Players \ PlayWnd`項目並探索代碼... – Cipi 2011-03-10 09:44:38

1

請在MSDN檢查OleCreatePropertyFrame的說明()。

Guid lcid無效。結果: 託管調試助手'PInvokeStackImbalance'在'D:\ CVS \ Dev \ Filters \ H264 \ H264mfxEncoder \ Samples \ C#\ H264EncoderTest \ bin \ Debug \ H264EncoderTest.vshost.exe'中檢測到問題。 附加信息:對PInvoke函數'H264EncoderTest!H264EncoderTest.CGraph :: OleCreatePropertyFrame'的調用使堆棧不平衡。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。

必須是:uint lcid 和hr = OleCreatePropertyFrame(form.Handle,0,0,info.achName,1,filters,pages.cElems,pages.pElems,0,0,IntPtr.Zero);