在ShellWindows上循环时出错

本文关键字:出错 循环 ShellWindows | 更新日期: 2024-09-21 08:18:34

在ShellWindows类上循环时,我偶尔会收到"错误HRESULT E_FAIL已从对COM组件的调用中返回"错误。似乎主要发生在电脑从睡眠中醒来之后。我必须重新启动我的计算机来清除这个错误,这是不好的。

错误发生在以下代码中的"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进行编译。

除了重新启动计算机之外,还有什么解决这个错误的建议吗?

在ShellWindows上循环时出错

从这个线程中我找到了解决方案。问题不在循环的开始,而是在第一个调试日志记录语句中。这行代码就是失败的地方。

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

并且它失败了,因为CCD_ 1是抛出异常的原因。

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

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

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

  1. "iexplore"
  2. "explorer"

processName="explorer"时,对Browser.HWND的调用会导致"错误HRESULT E_FAIL已从对COM组件的调用中返回。"错误。

为了防止错误,添加一个if语句:

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

只有当这句话是真的时才采取行动。