在ShellWindows上循环时出错

时间:2012-08-02 16:30:49

标签: c# .net internet-explorer hresult shdocvw

我偶尔会收到“错误HRESULT E_FAIL已从调用COM组件返回。”在ShellWindows类上循环时出错。似乎是在计算机从睡眠中唤醒后发生的。我必须重新启动计算机以清除此错误,这是不好的。

错误发生在以下代码中的“foreach”循环行:

log.Debug(String.Format("new ShellWindowsClass"));
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();

log.Debug(String.Format("Loop begin"));
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
    log.Debug(String.Format("Browser {0} ?= {1}", Browser.HWND, pid));
    if (Browser.HWND == pid)
    {
        found = Browser;
        break;
    }
}
log.Debug(String.Format("Loop end"));

我正在为Dot Net Framework 3.0编译。

除了重新启动计算机之外,还有任何解决此错误的建议吗?

1 个答案:

答案 0 :(得分:2)

this thread我找到了解决方案。问题不在于循环的开始,而是在第一个调试日志语句中。这行代码是失败的。

log.Debug(String.Format("Browser {0} ?= {1}", Browser.HWND, pid));

并且它失败了,因为Browser.HWND正在抛出异常。

解决方案是检查Browser变量并检查其进程名称。获取这样的进程名称:

string processName 
  = System.IO.Path.GetFileNameWithoutExtension(Browser.FullName).ToLower();

这样做,我通常会看到processName的值为:

  1. "iexplore"
  2. "explorer"
  3. processName="explorer"时,对Browser.HWND的调用导致“错误HRESULT E_FAIL已从调用COM组件返回。”错误。

    要防止出错,请添加if语句:

    if (processName.Equals("iexplore")) { . . . }
    

    只有当这个if语句为真时才会动作。