1

我偶尔会收到“错误 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 进行编译。

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

4

1 回答 1

2

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

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"

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

为防止该错误,请添加 if 语句:

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

并且仅当此 if 语句为真时才采取行动。

于 2012-08-08T14:30:50.867 回答