Quote Originally Posted by fafalone View Post
Hmm looks like it's high time to go and make a TLB with all the DirectShow interfaces like I just did for Core Audio. Saw this example then saw how easy ICaptureGraphBuilder2 makes capturing**...

The quartz.dll this project uses seems to have extremely few of the interfaces... is there a more thorough one before I go off on another massive interface conversion expedition?

Is there a particular reason a DLL is being used? Do the interfaces require some sort of background code that a TLB wouldn't support?

-----
* I was looking at this code... if I made such a TLB in a VB friendly form like usual, it looks like an easy direct translation:
Code:
#include <dshow.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
  CoInitialize(NULL);

  // 1. フィルタグラフ作成
  IGraphBuilder *pGraph = NULL;
  CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
      IID_IGraphBuilder, (void **)&pGraph);

  // 2. システムデバイス列挙子を作成
  ICreateDevEnum *pDevEnum = NULL;
  CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
      IID_ICreateDevEnum, (void **)&pDevEnum);

  IEnumMoniker *pClassEnum = NULL;
  pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);

  ULONG cFetched;
  IMoniker *pMoniker = NULL;
  IBaseFilter *pSrc = NULL;
  if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK){
    // 最初のモニカをフィルタオブジェクトにバインドする
    pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&pSrc);
    pMoniker->Release();
  }
  pClassEnum->Release();
  pDevEnum->Release();

  pGraph->AddFilter(pSrc, L"Video Capture");

  // 3. キャプチャビルダの作成
  ICaptureGraphBuilder2 *pBuilder = NULL;
  CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
      IID_ICaptureGraphBuilder2, (void **)&pBuilder);
  pBuilder->SetFiltergraph(pGraph);
  
  // 4. ファイルライタフィルタの設定
  IBaseFilter *pMux = NULL;
  IFileSinkFilter *pSink = NULL;

  // ファイルへ
  pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\dvcap_tmp.avi", &pMux, &pSink);
  pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSrc, NULL, pMux);
  REFERENCE_TIME rtStart = 50000000, rtStop = 80000000;
  pBuilder->ControlStream( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSrc, &rtStart, &rtStop,
      0, 0 );
  // ディスプレイへ
  pBuilder->RenderStream( &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrc, NULL, NULL );


  // 5. キャプチャ開始
  IMediaControl *pMediaControl;
  pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
  pMediaControl->Run();

  MessageBox(NULL, "Click to stop.", "DirectShow", MB_OK);
  
  // 6. 終了
  pSrc->Release();
  pMux->Release();
  pSink->Release();
  pMediaControl->Release();
  pEvent->Release();
  pBuilder->Release();
  pGraph->Release();
  CoUninitialize();

  cout << "end\n";
  return 0;
}
TLB or DLL should work. Not really sure what the difference is though. Aren't they both PE type files (just as EXE is as well)?