【问题标题】:Error looping over ShellWindows在 ShellWindows 上循环时出错
【发布时间】:2012-08-08 22:30:50
【问题描述】:

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

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

【问题讨论】:

  • 这发生在计算机完全唤醒之后。
  • 我删除了我的答案。我对这方面了解不多。我认为链接weblogs.asp.net/joberg/articles/405283.aspx 可能会有所帮助,因为它猜测它的 COM 组件处于某种中间状态并且调用它失败。很抱歉给您带来麻烦。

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


【解决方案1】:

来自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"

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

为防止出错,添加if语句:

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

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

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2018-04-19
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多