在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进行编译。
除了重新启动计算机之外,还有什么解决这个错误的建议吗?
从这个线程中我找到了解决方案。问题不在循环的开始,而是在第一个调试日志记录语句中。这行代码就是失败的地方。
log.Debug(String.Format("Browser {0} ?= {1}", Browser.HWND, pid));
并且它失败了,因为CCD_ 1是抛出异常的原因。
解决方案是检查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")) { . . . }
只有当这句话是真的时才采取行动。