# COM Surrogate とは？Windows でずっと動いているのはなぜ

COM Surrogateは`C:\Windows\System32`にある通常のWindowsプロセス`dllhost.exe`で、コンポーネントを別プロセスで動かし、そこでの障害を要求したプログラムに波及させないためのものです。表示される理由はたいてい、エクスプローラーがサムネイルを生成していることです。複数のコピーが動くのは普通で、フォルダーを見て回るうちに現れては消えるコピーは役目を果たしているだけです。ずっと忙しいコピーや、ファイルが「COM Surrogateで開かれています」と出る場合は、たいてい特定のサムネイルハンドラーか壊れたファイル1つが原因です。

## なぜ存在するのか

Windowsのプログラムは、DLLに入ったCOMコンポーネントとして追加のコードを読み込むことがよくあります。そのDLLがプログラム内でクラッシュすると、プログラムごと落ちます。Raymond Chenは[MicrosoftのOld New Thing](https://devblogs.microsoft.com/oldnewthing/20090212-00/?p=19173)で、エクスプローラーはサムネイルの抽出にCOM Surrogateを使うので、サムネイル抽出のクラッシュで壊れるのはエクスプローラーではなくサロゲートのプロセスだと説明しています。昔の「COM Surrogateが動作を停止しました」というメッセージもこれで説明がつきます。たいていはそこでコンポーネントがクラッシュしたという意味で、エクスプローラーは設計のおかげで無事だったのです。

Windowsは、特定のコンポーネントを指定して起動します。

```text
C:\Windows\System32\dllhost.exe /Processid:{AB8902B4-09CA-4BB6-B78D-A8F59079A8D5}
```

調べるべきなのはこのIDで、これはWindowsのサムネイルキャッシュです。ほかのプログラムも自分のコンポーネントに同じプロセスを使うので、忙しいコピーの背後に誰がいるかは、名前だけでは分かりません。

## どのコンポーネントかを調べる

1. `Ctrl + Shift + Esc`を押して、**詳細**タブを開きます。
2. 列見出しを右クリックして**列の選択**を選び、**コマンド ライン**にチェックを入れます。
3. `dllhost.exe`を探して、`/Processid:`の後ろのIDを読みます。

PowerShellですべてのコピーを一覧にすることもできます。

```powershell
Get-CimInstance Win32_Process | Where-Object Name -eq 'dllhost.exe' | Select-Object ProcessId, CommandLine
```

次に、自分のIDに置き換えて調べます。

```powershell
(Get-ItemProperty 'Registry::HKEY_CLASSES_ROOT\CLSID\{AB8902B4-09CA-4BB6-B78D-A8F59079A8D5}').'(default)'
```

Windows 11ではこれが`Thumbnail Cache Class Factory for Out of Proc Server`を返します。自分の環境でサードパーティ製品の名前が出るなら、その製品のアップデートか削除が解決策です。

## 症状ごとの対処

| 見えるもの | 考えられる原因 | 試すこと |
| --- | --- | --- |
| 特定のフォルダーを開いている間、CPUやディスクの使用率が高い | 大きなファイルが多く、サムネイルを生成している | 待つか、そのフォルダーの表示を**詳細**に切り替える |
| 同じフォルダーで毎回CPU使用率が高い | 壊れたメディアファイル1つ、またはそれで失敗するコーデック | ファイルを数個ずつ移して原因を探し、コーデックパックを更新または削除する |
| 「ファイルがCOM Surrogateで開かれているため、操作を完了できません」 | サムネイルハンドラーがそのファイルをまだ保持している | プレビュー ウィンドウとフォルダーを閉じ、数秒待ってからやり直す |
| 何度もクラッシュする、または「動作を停止しました」と出る | サードパーティ製コンポーネントの故障 | 上の方法でIDを読み、そのソフトウェアを更新または削除する |
| サムネイルが違う、または古い | サムネイルキャッシュの破損 | ディスク クリーンアップで**縮小版**を消去する。[ディスク クリーンアップとストレージ センサー](/ja/windows/blog/disk-cleanup-vs-storage-sense-windows)を参照 |

サムネイルの生成そのものを止めるには、**エクスプローラー › もっと見る（…） › オプション › 表示**を開き、**常にアイコンを表示し、縮小版は表示しない**にチェックを入れます。負荷は下がりますが、フォルダーで画像が見えなくなります。切り分けにも向いていて、問題が止まればサムネイルが原因だったと分かります。

## ウイルスなのか

本物はMicrosoftの署名が付いた`C:\Windows\System32`のファイルで、32ビット版のコピーが`C:\Windows\SysWOW64`にあります。マルウェアがこの名前をまねることもあれば、本物の`dllhost.exe`の内部で自前のコードを動かすこともあるため、パスが正しいことは有力な証拠でも証明にはなりません。まずファイルを確認します。

```powershell
Get-AuthenticodeSignature C:\Windows\System32\dllhost.exe
```

署名者は`Microsoft Windows`と表示されるはずです。ほかの場所から動いている`dllhost.exe`、ネットワーク通信が多いコピー、コンポーネントIDが`AppData`や`Temp`のファイルを指しているものは疑ってください。どれかに当てはまれば、Microsoft Defenderでフルスキャンを実行します。

## やってはいけないこと

- `dllhost.exe`を削除したりブロックしたりしない。Windowsも多くのプログラムもこれに依存していて、システム ファイル チェッカーは欠けたコピーを破損として扱います。
- 終了すれば直ると期待しない。止まったコピーを終了するのは安全で、サムネイルやダイアログが一度失敗するかもしれませんが、必要になればWindowsが新しく起動します。ただし原因はそのまま残ります。
- 古いガイドにあるように、データ実行防止の例外に追加しない。壊れたコンポーネントを見つけないまま、保護だけを下げることになります。
- これのためにレジストリ クリーナーや「DLL修復ツール」を入れない。どちらも、どのコンポーネントが失敗しているかは特定できません。

## Moleでできること

Mole for WindowsのステータスはCOM Surrogateをセッションごとに1行にまとめ、CPUとメモリはコピー全体の合計で表示します。行のメニューの**なぜ実行中？**には、負荷の高いコピーがPID、CPU、メモリとともに並び、**実行ファイル**と起動元、さらに自分のアカウントで昇格せずに動いているコピーなら`/Processid`付きの**コマンド**も表示するので、タスク マネージャーで列を追加する手間が省けます。コピーをクリックすると、そのコピー自身の詳細が見られます。COM SurrogateはWindowsフォルダーから動くため、Moleはシステムとして扱い、**終了**も**強制終了**も出しません。止まったコピーを終わらせたいときはタスク マネージャーを使ってください。Moleはサムネイルハンドラーを修復しませんし、クリーンにもサムネイルキャッシュの項目はないので、それにはディスク クリーンアップを使います。より広い背景は[Windowsの一般的なプロセスの役割](/ja/windows/blog/windows-processes-explained)を参照してください。

## よくある質問

### COM Surrogateとは？

`dllhost.exe`のことで、コンポーネントを、それを使うプログラムの外で動かすWindowsのプロセスです。そこでのクラッシュはそこで収まります。エクスプローラーはサムネイルに使い、ほかのプログラムも使います。

### COM Surrogateのプロセスがたくさんあるのはなぜ？

各コピーが1つのコンポーネントを動かすので、同時に複数あるのは普通です。多くは、しばらくアイドル状態が続くと自分で終了します。

### COM Surrogateを終了してもいい？

はい。止まったコピーを終了するのは安全で、必要になればWindowsが新しいコピーを起動します。同じコピーが何度も忙しい状態で戻ってくるなら、繰り返し終了するのではなく、そのコンポーネントIDを調べてください。

### ファイルがCOM Surrogateで開かれていると出るのはなぜ？

サムネイルハンドラーがそのファイルを読んでいるからです。フォルダーとプレビュー ウィンドウを閉じ、数秒待ってからやり直してください。同じ種類のファイルで繰り返すなら、**常にアイコンを表示し、縮小版は表示しない**をオンにして原因を確かめます。

### COM Surrogateはウイルス？

本物のファイルは違います。`C:\Windows\System32`か`C:\Windows\SysWOW64`から動いていて、Microsoft Windowsの署名があることを確認し、次にどのコンポーネントを動かしているかを見てください。


Canonical: https://mole.fit/ja/windows/blog/com-surrogate-dllhost
