2013-07-21 20 views
0

我正在編寫一個將文件源連接到MPEG4 DMO的Directshow應用程序。
該圖如下所示:
文件來源 - > DMO包裝過濾器 - >視頻呈現器。
以下是我的問題:
1.如何在圖形中添加文件源過濾器?我得到了這段代碼,它加上了生成的圖片。這段代碼是否正確?我看到它使用需要「atlbase.h」的「CComPtr」。使用VS2010 Express版本時,我沒有atl頭文件。使用IFileSourceFilter添加文件源

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.)"); 

2.我從網上手動下載「atlbase.h」,我遇到了幾個生成錯誤。在這種情況下可以做些什麼。

請幫助我朝着正確的方向前進!

謝謝,
希亞姆

回答

0

上述生成的代碼是正確的。爲了擺脫你的編譯錯誤,請下載並安裝最新的windows sdk。它應該有正確的atl頭。

+0

latest windows sdk does not with the at header。 –

+0

嗯,我認爲你是正確的....它帶有定期的視覺工作室版本,而不是表達..最簡單的方法是或許下載試用版視覺工作室和解決依賴。 – Saibal

0

可以在沒有ATL的情況下爲Directshow編寫C++代碼,但除非你喜歡spagetti泄露,否則我絕不會推薦它。以下是您的代碼的樣子

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對於一個簡單的應用程序也會更容易。