C++ 使用IFileSourceFilter添加文件源

C++ 使用IFileSourceFilter添加文件源,c++,filter,directshow,atl,C++,Filter,Directshow,Atl,我正在编写一个Directshow应用程序,它将文件源连接到MPEG4s DMO。 该图如下所示: 文件源->DMO包装过滤器->视频渲染器。 以下是我的问题: 1.如何在图形中添加文件源筛选器?我得到了Graphidit plus生成的这段代码。这段代码正确吗?我看到它使用了需要“atlbase.h”的“CComPtr”。对于VS2010 Express edition,我没有atl标题 LPCOLESTR srcFile1 = L"C:\\Users\shyam\\Downloads\\sa

我正在编写一个Directshow应用程序,它将文件源连接到MPEG4s DMO。
该图如下所示:
文件源->DMO包装过滤器->视频渲染器。
以下是我的问题:
1.如何在图形中添加文件源筛选器?我得到了Graphidit plus生成的这段代码。这段代码正确吗?我看到它使用了需要“atlbase.h”的“CComPtr”。对于VS2010 Express edition,我没有atl标题

LPCOLESTR srcFile1 = L"C:\\Users\shyam\\Downloads\\sample.avi";
CComPtr<IBaseFilter> pBaseFilter;
hr = pBaseFilter.CoCreateInstance(CLSID_AsyncReader);
CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter;
ATLASSERT(pFileSourceFilter);
pFileSourceFilter->Load(srcFile1, NULL);
hr = pGB->AddFilter(pBaseFilter, L"File Source (Async.)"); 
LPCOLESTR srcFile1=L“C:\\Users\shyam\\Downloads\\sample.avi”;
CComPtr pBaseFilter;
hr=pBaseFilter.CoCreateInstance(CLSID_AsyncReader);
CComQIPtr pFileSourceFilter=pBaseFilter;
ATLASSERT(pFileSourceFilter);
pFileSourceFilter->Load(srcFile1,NULL);
hr=pGB->AddFilter(pBaseFilter,L“文件源(异步)”;
二,。我从网上手动下载了“atlbase.h”,遇到了几个构建错误。在这种情况下可以做些什么

请帮我朝正确的方向走

谢谢,

Shyam

上面生成的代码是正确的。要消除编译错误,请下载并安装最新的windows sdk。它应该有正确的ATL标题。

< P>没有Atl,可以直接编写DirectShow的C++代码,但是我强烈建议不要,除非你喜欢泄露的SpaGETTI。下面是您的代码的外观

LPCOLESTR srcFile1 = L"C:\\Users\shyam\\Downloads\\sample.avi";
CComPtr<IBaseFilter> pBaseFilter;
hr = pBaseFilter.CoCreateInstance(CLSID_AsyncReader);
CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter;
ATLASSERT(pFileSourceFilter);
pFileSourceFilter->Load(srcFile1, NULL);
hr = pGB->AddFilter(pBaseFilter, L"File Source (Async.)"); 
IBaseFilter* pBaseFilter;
CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pBaseFilter);

IFileSourceFilter* pFileSourceFilter = NULL;
hr = pBaseFilter->QueryInterface(IID_IFileSourceFilter, (void**)&pFileSourceFilter);

ASSERT(pFileSourceFilter != NULL);

hr = pFileSourceFilter->Load(L"C:\\Users\shyam\\Downloads\\sample.avi", NULL);

if (pFileSourceFilter)
    pFileSourceFilter->Release();

hr = pFileSourceFilter->AddFilter(pBaseFilter, L"AsyncReader");
您还需要在每一步检查hr是否存在错误。
最新的Windows SDK可能没有所有的Directshow界面,因此我建议针对Windows Vista更新Microsoft Windows SDK(针对qedit.h)。但是说真的,请不要在没有ATL的情况下编写Directshow或COM代码,即使是c#中的DirectshowLib对于一个简单的应用程序来说也会更容易。

hmm我想你是对的……它附带了常规的visual studio版本,而不是express。。最简单的方法可能是下载VisualStudio的试用版并计算出依赖关系。