title: Casting mshtml.IHTMLImgElement to mshtml.IHTMLElementRender fails with E_NOINTERFACE
body: <p>I have C# .NET 4 WinForms app (using MSHTML 7) that launches new and connects to existing IE 10 instances. It iterates through all images and downloads them to manipulate. This approach is time-consuming and redundant since the image has already been downloaded by IE.</p>
  
  <p>I have searched everywhere and only a handful of forums discuss the subject but all are able to cast mshtml.IHTMLImgElement objects to mshtml.IHTMLElementRender (although in C++ code).</p>
  
  <pre><code>Unable to cast COM object of type 'mshtml.HTMLImgClass' to interface type 'mshtml.IHTMLElementRender'.
  This operation failed because the QueryInterface call on the COM component for the interface with IID '{3050F669-98B5-11CF-BB82-00AA00BDCE0B}' failed due to the following error:
  No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
  </code></pre>
  
  <p>The objective of course is to gain access to the full image so alternative approaches are welcome as well. Here is the code causing the exception above.</p>
  
  <pre><code>public static void Main (string [] args)
  {
      mshtml.HTMLDocument document = null;
      SHDocVw.InternetExplorer explorer = null;
      System.IntPtr hdc = System.IntPtr.Zero;
      mshtml.IHTMLElementRender render = null;
      mshtml._RemotableHandle handle = default(mshtml._RemotableHandle);
  
      try
      {
          explorer = new SHDocVw.InternetExplorer();
          explorer.Visible = true;
  
          try
          {
              explorer.Navigate("http://www.google.com/ncr");
  
              while (explorer.Busy)
              {
                  // Striped events for SO example.
                  System.Threading.Thread.Sleep(100);
              }
  
              document = (mshtml.HTMLDocument) explorer.Document;
  
              foreach (mshtml.IHTMLImgElement image in document.images)
              {
                  Console.WriteLine();
  
                  if ((image.width &gt; 0) &amp;&amp; (image.height &gt; 0))
                  {
                      // The following [if] will return false if uncommented.
                      //if (image.GetType().GetInterfaces().ToList().Contains(typeof(mshtml.IHTMLElementRender)))
                      {
                          using (Bitmap bitmap = new Bitmap(image.width, image.height))
                          {
                              using (Graphics graphics = Graphics.FromImage(bitmap))
                              {
                                  hdc = graphics.GetHdc();
                                  handle.fContext = hdc.ToInt32();
                                  render = (mshtml.IHTMLElementRender) image; // Causes the exception.
                                  //handle = (mshtml._RemotableHandle) Marshal.PtrToStructure(hdc, typeof(mshtml._RemotableHandle));
                                  render.DrawToDC(ref handle);
                                  graphics.ReleaseHdc(hdc);
  
                                  // Process image here.
  
                                  Console.Write("Press any key to continue...");
                                  Console.ReadKey();
                              }
                          }
                      }
                  }
              }
          }
          catch (System.Exception e)
          {
              Console.WriteLine(e.Message);
              Console.WriteLine("Stack Trace: " + e.StackTrace);
          }
  
          explorer.Quit();
      }
      catch (System.Exception e)
      {
          Console.WriteLine(e.Message);
          Console.WriteLine("Stack Trace: " + e.StackTrace);
      }
      finally
      {
      }
  
  #if (DEBUG)
          Console.WriteLine();
          Console.Write("Press any key to continue...");
          Console.ReadKey();
  #endif
  }
  </code></pre>
  
  <p>Some of the links I have gone through without avail:</p>
  
  <ul>
  <li><a href="http://www.codeproject.com/Articles/6601/Capture-an-HTML-document-as-an-image" rel="nofollow noreferrer">Capture an HTML document as an image</a></li>
  <li><a href="https://stackoverflow.com/a/10774344/938668">Unable to cast COM object of type '…' to interface type '…' while using an ExeCOMServer</a></li>
  </ul>