title: Using DirectShow c++'s API with C# (COM component)
body: <p>I am developing a Windwos form application using Directshow.
  At start I was using Quarts.dll located in windows/system32 in purpose of getting the basic API of Directshow. 
  After a while I realized I need the whole API of Directshow, because I need to create a new Video Renderer filter (VM7).
  For this to take place I need to have access to some of the interfaces provided in Directshow c++ API.
  I discovered that Directshow is a COM component and I can get access to his API in C#, if I find the right way to bound with it.</p>
  
  <p>Now, this is what I did to get access to the API:</p>
  
  <p>I found out that the C++ API is provided in the Windows SDK. The API I need are located in devenum.idl, axcore.idl and axextend.idl. </p>
  
  <p>Those are interface description language files, and I found out that I can use the midl.exe through the cmd to create a .tlb file (a typelib), now with the file's help I can get access to the interfaces I need. But to use the midl compiler I needed to create a new .idl file that contains the interfaces I want, it looks like that:</p>
  
  <pre><code>import "devenum.idl";
  import "axcore.idl";
  import "axextend.idl";
  
  [
  uuid(A68F9934-FDB9-4AAE-A631-F9307171B2FA),
  helpstring("DirectShow interfaces")
  ]
  library DirectShow
  {
      interface IFilterGraph;
      interface ICreateDevEnum;
      interface IGraphBuilder;
      interface ICaptureGraphBuilder2;
      interface IFileSinkFilter;
      interface IFileSinkFilter2;
      interface IAMAudioInputMixer;
  };
  </code></pre>
  
  <p>That required to create a new guid.</p>
  
  <p>After that I was able to run the midl and create a .tlb file, But when I tried to add reference to the .tlb file it gave an error. </p>
  
  <p>I found a way to create a .dll file from this .tlb file, by running tlbimp.exe through the cmd on the .tlb file. It created a .dll that I succeeded to add to my project.
  Now Visual Studio knows how to interact withh all the interfaces I was trying to get.</p>
  
  <p>But for the problem I am facing now:</p>
  
  <p>At runtime I am getting this error:</p>
  
  <p><b>
  Retrieving the COM class factory for component with CLSID {56A868A9-0AD4-11CE-B03A-0020AF0BA770} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
  </b></p>
  
  <p>I can see that the component clsid of the problem is not the clsid of the library in the .idl file I created, it could testify that the problem is on the import files I am using, maybe a bad guid in those files?</p>
  
  <p>I also think the problem can be that the .dll is not registered on my system. I tried to use the regsvr32 but It gave me an error saying:</p>
  
  <p><b>
  The module "directshow.dll" was loaded but the entry-point DLLRegisterServer was not found...
  </b></p>
  
  <p>Now somebody please save me and tell me how to fix the problem or suggest me a different solution of using the C++ API of Directshow through c#.</p>