1

「COMコンポーネントの呼び出しからエラーHRESULTE_FAILが返されました」というメッセージが表示されることがあります。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 NetFramework3.0用にコンパイルしています。

コンピュータを再起動する以外に、このエラーに対処するための提案はありますか?

4

1 に答える 1

2

このスレッドから 解決策を見つけました。問題はループの開始ではなく、最初のデバッグ ログ ステートメントにあります。このコード行が失敗しています。

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、「COM コンポーネントへの呼び出しからエラー HRESULT E_FAIL が返されました。」が発生します。エラー。

エラーを回避するには、if ステートメントを追加します。

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

そして、この if ステートメントが true の場合にのみ行動します。

于 2012-08-08T14:30:50.867 に答える