如何对DirectShow图进行反向工程?
时间:2020-03-05 18:43:15 来源:igfitidea点击:
我有一个DirectShow图,可以从网络流中渲染MPEG2 / 4电影。当我通过手动连接引脚组装图形时,它不会呈现。但是,当我在GraphBuilder上调用Render时,它可以很好地渲染。
显然,有一些设置步骤无法在GraphBuilder执行的图形中的某些过滤器上执行。
组装图形时,有什么方法可以查看GraphBuilder的调试输出吗?
有没有一种方法可以转储工作图以查看如何将其组合在一起?
关于揭开DirectShow包装盒中的奥秘的任何其他想法?
谢谢!
-Z
解决方案
回答
我们可以观看使用GraphEdit(DirectShow SDK中的工具)创建的图形。在GraphEdit中,选择"文件"->"连接到远程Graph ..."。
为了在列表中找到图形,我们必须在运行对象表中注册它:
void AddToRot( IUnknown *pUnkGraph, DWORD *pdwRegister ) { IMoniker* pMoniker; IRunningObjectTable* pROT; GetRunningObjectTable( 0, &pROT ); WCHAR wsz[256]; swprintf_s( wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId() ); CreateItemMoniker( L"!", wsz, &pMoniker ); pROT->Register( 0, pUnkGraph, pMoniker, pdwRegister ); // Clean up any COM stuff here ... }
销毁图形后,应通过调用IRunningObjectTable :: Revoke将其从ROT中删除。
回答
DirectX的较旧版本,我相信9a,但9b却没有dshow的"调试模式"。它将调试信息的日志输出到调试控制台。
因此,下载较旧的版本,将其设置为调试。然后在Visual Studio中打开debugview或者加载graphedtt.exe以查看调试信息。
回答
Roman Ryltsov创建了DirectShow筛选器图形间谍工具(http://alax.info/blog/777),它是FilterGraph界面上的包装COM dll,用于记录对FilterGraph方法的所有调用。
它还会将所有创建的图形添加到"运行对象表"(ROT)中,然后我们可以使用诸如GraphEdit或者GraphStudio之类的工具对其进行可视化。当我们需要查看Windows Media Player图的外观时非常有用。