Ошибка зацикливания на ShellWindows

Иногда я получаю сообщение "Ошибка 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.

Любые предложения по устранению этой ошибки, кроме перезагрузки компьютера?

1 ответ

Из этой темы я нашел решение. Проблема не в начале цикла, а в первом операторе журнала отладки. Эта строка кода - то, что терпит неудачу.

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")) { . . . }

И действовать только в том случае, если это утверждение верно.

Другие вопросы по тегам