Ошибка зацикливания на 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.

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


person Michael Remijan    schedule 02.08.2012    source источник
comment
Это происходит после того, как компьютер полностью проснется.   -  person Michael Remijan    schedule 03.08.2012
comment
Я удалил свой ответ. Я мало что знаю об этом. Я думал, что ссылка weblogs.asp.net/joberg/articles/405283.aspx может помочь, основываясь на предположении, что компонент COM находится в каком-то промежуточном состоянии, и вызов его завершается ошибкой. Извините за беспокойство.   -  person Ankush    schedule 03.08.2012


Ответы (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")) { . . . }

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

person Michael Remijan    schedule 08.08.2012