现在的位置: 首页 > 综合 > 正文

用GraphEdit查看程序创建的Graph

2014年01月01日 ⁄ 综合 ⁄ 共 2010字 ⁄ 字号 评论关闭

#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();
    }
}

 

抱歉!评论已关闭.