我偶尔会收到“错误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编译。
除了重新启动计算机之外,还有任何解决此错误的建议吗?
答案 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
的值为:
"iexplore"
"explorer"
processName="explorer"
时,对Browser.HWND
的调用导致“错误HRESULT E_FAIL已从调用COM组件返回。”错误。
要防止出错,请添加if语句:
if (processName.Equals("iexplore")) { . . . }
只有当这个if语句为真时才会动作。