创建了IFileSourceFilter,可IFileSourceFilter好像不是从IBaseFilter继承来的,没有EnumPins,那应该怎么查找IFileSourceFilter上的pin啊?

IGraphBuilder *pigb  = NULL;
IMediaControl *pimc  = NULL;
IMediaEventEx *pimex = NULL;
IVideoWindow  *pivw  = NULL;
IMediaSeeking  *pims  = NULL;

HRESULT AddSourceByFilterCLSID(IGraphBuilder *pGraph,const GUID& clsid,	LPCWSTR wszName,LPCWSTR wszFileName)
{
		if  (!pGraph) return E_POINTER;
		IBaseFilter *pF = 0;
		HRESULT      hr = S_OK;
		hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pF));
		if (SUCCEEDED(hr))
		{
			hr = pGraph->AddFilter(pF, wszName);
			if (SUCCEEDED(hr))
			{
				IFileSourceFilter *pSF = NULL;
				hr = pF->QueryInterface(IID_IFileSourceFilter, (void**)&pSF);
				if (SUCCEEDED(hr))
				{
					pSF->Load(wszFileName, NULL);
					pSF->Release();
				}
			}

			if (SUCCEEDED(hr))
			{
				IEnumPins *pEnum;
				IPin      *pPin;
				hr = pF->EnumPins(&pEnum);
				if (SUCCEEDED(hr))
				{
					while(pEnum->Next(1, &pPin, 0) == S_OK)
					{
						PIN_DIRECTION pinDirThis;
						pPin->QueryDirection(&pinDirThis);
						if (PINDIR_OUTPUT == pinDirThis)
						{
							hr = pGraph->Render(pPin);
							if (FAILED(hr))
							{
								break;
							}
						}
						pPin->Release();
					}
					pEnum->Release();
				}
			}

			pF->Release();
		}
		return hr;
}

HRESULT RenderAVI(LPCTSTR szFilePath,IGraphBuilder * gb)
{
	LPCTSTR szExt = _tcsrchr(szFilePath,'.');//过滤avi文件
	if(!szExt)
	{
		return E_FAIL;
	}
	++szExt;
	if(_tcsicmp(szExt,_T("avi"))!=0) return E_INVALIDARG;
	USES_CONVERSION;
	const GUID CLSID_AviSource={0xCEA8DEFF,0x0AF7,0x4DB9,{0x9A,0x38,0xFB,0x3C,0x3A,0xEF,0xC0,0xDE}};
	CComPtr<IBaseFilter> spAviSource;
	HRESULT hr = AddSourceByFilterCLSID(gb,CLSID_AviSource,L"SOURCE FILTER",T2W(szFilePath));
	if(spAviSource==NULL) return hr;
/*	CComQIPtr<IFileSourceFilter> FileSource(spAviSource);
	hr = FileSource->Load(T2W(szFilePath),NULL);
	if(FAILED(hr)) return hr;
	CComPtr<IEnumPins> ep;
	hr = spAviSource->EnumPins(&ep);
	if(FAILED(hr)) return hr;
	CComPtr<IPin> pin;
	DWORD dwCount;
	int i = 0;
	for(;;)
	{
		dwCount = 0;
		hr = ep->Next(1,&pin,&dwCount);
		if(hr!=NOERROR)
		{
			if(i) hr = NOERROR;
			break;
		}
		hr = gb->Render(pin);
		if(hr==NOERROR) ++i;
		pin = NULL;
	}
	return hr;*/
	return NOERROR;
}

void CTestFilterDlg::OnButton4()
{
	// TODO: Add your control notification handler code here
	CoInitialize(NULL);
    HRESULT	hr = CoCreateInstance(CLSID_FilterGraph,
		NULL,
		CLSCTX_INPROC_SERVER,
		IID_IGraphBuilder,
		(void **)&pigb);
	   pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);
	   pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);
       pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);
	   pigb->QueryInterface(IID_IVideoWindow, (void **)&pivw);
	  // hr = pigb->RenderFile(L"d:\\temp\\bmw.MPG", NULL);//
      hr = RenderAVI("F:\\FFOutput\\ff640480.avi",pigb);

      if (hr)
      {
		  MessageBox("ERR RENDERAVI!");
      }

	   HWND m_hwndScreen = m_Screen2.GetSafeHwnd();

	   RECT rc;

	   hr = pivw->put_Owner((OAHWND)m_hwndScreen);
	   hr = pivw->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
	   m_Screen2.GetClientRect(&rc);
	   hr = pivw->SetWindowPosition(0, 0, (rc.right), (rc.bottom));
	   hr = pivw->put_Visible(OATRUE);//*/
	   hr = pimc->Run();
}
05-11 19:24