#include <Dshow.h>
#include <stdio.h>
HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister);
void RemoveFromRot(DWORD pdwRegister);
void main(void)
{
IGraphBuilder *pGraph=NULL;
IMediaControl *pControl=NULL;
IMediaEvent *pEvent=NULL;
DWORD dwRegister;
HRESULT hr=CoInitialize(NULL);
if(FAILED(hr))
{
printf("ERROR----Can not initialize com library");
return;
}
hr=CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void**)&pGraph);
//----------------------------------------
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif
//--------------------------------------------
if(FAILED(hr))
{
printf("ERROR----Can not initialize filter graph manager!");
return;
}
hr=pGraph->QueryInterface(IID_IMediaControl,(void**)&pControl);
hr=pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
hr=pGraph->RenderFile(L"E://backstreet.asf",NULL);
if(SUCCEEDED(hr))
{
pControl->Run();
if(SUCCEEDED(hr))
{
long evCode;
pEvent->WaitForCompletion(INFINITE,&evCode);
}
}
//--------------------------------------
#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
//-----------------------------------
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
// 在应用程序成功创建了一个Filter Graph之后调用AddToRot进行注册
// pUnkGraph:Filter Graph Manager对象指针
// pdwRegister:成功注册后返回的一个ID
HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
IMoniker * pMoniker;
IRunningObjectTable *pROT;
if (FAILED(GetRunningObjectTable(0, &pROT))) {
return E_FAIL;
}
WCHAR wsz[256];
wsprintfW(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if (SUCCEEDED(hr)) {
hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
// 在销毁Filter Graph Manager对象之前,调用RemoveFromRot进行反注册
// pdwRegister为成功调用AddToRot函数后返回的ID
void RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
pROT->Revoke(pdwRegister);
pROT->Release();
}
}