C# 将mshtml.IHTMLImgElement强制转换为mshtml.ihtmlelementtrender失败,没有接口
我有一个C#.NET 4 WinForms应用程序(使用MSHTML7),可以启动新的并连接到现有的IE 10实例。它遍历所有图像并下载它们以进行操作。这种方法既耗时又冗余,因为IE已经下载了图像 我到处搜索,只有少数论坛讨论这个主题,但是所有人都能够将MSHML.IHTMLIMGEngEnter对象转换成MSHML.IHTMLeNeMeNeNeNeDER(虽然是C++代码)。 当然,我们的目标是获取完整的图像,因此也欢迎其他方法。下面是导致上述异常的代码C# 将mshtml.IHTMLImgElement强制转换为mshtml.ihtmlelementtrender失败,没有接口,c#,.net,internet-explorer,com-interop,mshtml,C#,.net,Internet Explorer,Com Interop,Mshtml,我有一个C#.NET 4 WinForms应用程序(使用MSHTML7),可以启动新的并连接到现有的IE 10实例。它遍历所有图像并下载它们以进行操作。这种方法既耗时又冗余,因为IE已经下载了图像 我到处搜索,只有少数论坛讨论这个主题,但是所有人都能够将MSHML.IHTMLIMGEngEnter对象转换成MSHML.IHTMLeNeMeNeNeNeDER(虽然是C++代码)。 当然,我们的目标是获取完整的图像,因此也欢迎其他方法。下面是导致上述异常的代码 public static void
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 > 0) && (image.height > 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
}
我通过的一些链接无效:
责任就在这里,你不能让这一切顺利。您需要自己渲染该图像,这并不容易。对不起,请不要向信使开枪。废话。另一种选择是使用IViewObject,它有自己的怪癖。由于您提到的实现原因,这不能通过COM互操作实现,但可以通过本机代码实现,我的理解是否正确?如果是这样的话,一个快速的本地DLL来呈现和保存图像会比IViewObject更好。我肯定会把我的答案限制在原来的问题上,并解释为什么这会出错。你要说的只是一句“祝你好运!”的评论。我将把它当作是肯定的,并给它一个机会:P。感谢你的精彩解释,以及它将为将来的com接口相关问题节省的时间。
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 > 0) && (image.height > 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
}