自定义Directshow过滤器的属性页

时间:2011-02-14 15:35:07

标签: c++ dll directshow base-class graphedit

我设法创建了一个自定义DirectShow转换过滤器,注册它,并将其导出到DLL中。它现在可以在GraphEdit和C ++测试程序中正常工作。我的下一个目标是创建一个自定义界面来控制过滤器的主要参数,从测试应用程序或GraphEdit中的属性页面。

these instructions之后,我从C ++测试程序中获得了正确的自定义界面。但是,我在属性页面上遇到了困难:我在GraphEdit中不断收到错误消息“无法显示请求的属性页”。

在调试时,我发现调用的唯一方法(在我的自定义属性页面类中,派生自CBasePropertyPage)是OnConnect()OnDisconnect() - 奇怪(或不是?)被调用两次。在这两个方法之间,对CBasePropertyPage方法(基类中的文件cprop.cpp)进行了一些调用,一切看起来都很好,直到:

STDMETHODIMP CBasePropertyPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)

更准确地说是

m_hwnd = CreateDialogParam(g_hInst, MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM) this);

我总是将m_hwnd设为0,导致该方法返回错误。我试图在此指令后立即添加GetLastError(),但它总是返回0,没有错误。此外,CreateDialogParam()的每个参数看起来都已正确初始化......

非常感谢任何帮助!


编辑

目前,为了至少有一个工作示例,我使用了MSDN tutorial中描述的相同的资源/模板。


---编辑2 ---

在稍微调试一下时,我尝试从Dialog资源中删除每个控件(按钮,滚动条)。在那之后...一切正常。 CreateDialogParam()返回正确的值,我的班级OnActivate()被调用,依此类推。我最终在GraphEdit中获得了一个“过滤器属性”页面,但是为空(除了默认对话框窗口)。

但是只要我有控件,例如一个MF命令按钮,出现以前的问题。

DirectShow基类和我使用的控件之间是否存在任何不兼容性? (如果是这样,为什么提供的样本没有提到任何内容?)是否有更简单的方法将控件添加到属性页?

(我绝对不是 GUI和Win32控件的专家......)

1 个答案:

答案 0 :(得分:1)

看起来问题来自我为Property Page创建控件的方式。我使用一个简单的“Formview”资源,但我试图通过图形资源查看器(或任何你想要调用它)添加控件:右键单击,“插入ActiveX控件...”并使用“Microsoft Form 2.0”

使用带有普通旧Win32控件的Formview资源(使用CreateWindowEx()初始化并使用经典消息循环进行管理),一切正常。

非常感谢你的帮助!