# COM Surrogate 是什麼，為什麼一直在執行

COM Surrogate 是 Windows 的正常處理程序，就是 `C:\Windows\System32` 裡的 `dllhost.exe`，它把某個元件放在獨立的處理程序中執行，這樣元件出問題時，不會拖垮呼叫它的程式。你看到它，通常是因為檔案總管正在產生縮圖。同時有好幾個是正常的，一個隨著你瀏覽資料夾出現又消失的，正在做它該做的事。如果有一個一直很忙，或者檔案顯示「已在 COM Surrogate 中開啟」，多半指向某個縮圖處理常式，或某個有問題的檔案。

## 它為什麼存在

Windows 程式常常會把額外的程式碼當成 DLL 裡的 COM 元件載入。如果那個 DLL 在程式裡當掉，整個程式也會跟著當掉。Raymond Chen 在 [Microsoft 的 Old New Thing](https://devblogs.microsoft.com/oldnewthing/20090212-00/?p=19173) 解釋，檔案總管擷取縮圖時會用 COM Surrogate，所以縮圖擷取器當掉時，毀掉的是 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 都很高 | 有一個損壞的媒體檔案，或編解碼器處理不了它 | 分批把檔案移出去找出它，再更新或移除編解碼器套件 |
| 「無法完成此動作，因為檔案已在 COM Surrogate 中開啟」 | 有縮圖處理常式還抓著那個檔案 | 關閉預覽窗格和資料夾，等幾秒再試 |
| 一直當掉或「已停止運作」 | 第三方元件損壞 | 照上面的方式讀出 ID，然後更新或移除那個軟體 |
| 縮圖錯誤或過時 | 縮圖快取損壞 | 在磁碟清理中清除**縮圖**，見[磁碟清理與儲存空間感知](/tw/windows/blog/disk-cleanup-vs-storage-sense-windows) |

要完全停止產生縮圖，開啟**檔案總管 › 查看更多（…） › 選項 › 檢視**，勾選**一律顯示圖示，不要顯示縮圖**。這樣能減輕負擔，代價是資料夾裡不再有圖片預覽。它也是個好測試：如果問題停了，就是縮圖造成的。

## 它是病毒嗎

真正的檔案是 `C:\Windows\System32` 裡由 Microsoft 簽署的檔案，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 會再啟動一個新的，但原因仍然存在。
- 不要像舊教學那樣，把它加進資料執行防止（DEP）的例外。那樣只是降低了一項保護，卻沒有找出損壞的元件。
- 不要為了這件事安裝登錄清理工具或「DLL 修復工具」，它們都無法找出是哪個元件出了問題。

## Mole 能幫上什麼

Mole for Windows 的**狀態**頁會把 COM Surrogate 合併成每個工作階段一列，CPU 和記憶體是它所有副本的加總。這一列的選單裡的**為什麼在執行？**會列出最吃資源的幾個副本，附上 PID、CPU 和記憶體，並顯示**可執行檔案**、是誰啟動它的，以及以你自己的帳號未提高權限執行的副本的**指令**（含 `/Processid`），省去在工作管理員裡加資料行的步驟。點某個副本可以看它自己的詳細資料。因為 COM Surrogate 從 Windows 資料夾執行，Mole 會把它標為系統項目，不提供**結束**或**強制結束**，需要結束卡住的副本時請用工作管理員。Mole 不會修復縮圖處理常式，**清理**頁也沒有縮圖快取的項目，那部分請用磁碟清理。想了解更廣的背景，請看[常見的 Windows 處理程序在做什麼](/tw/windows/blog/windows-processes-explained)。

## 常見問題

### COM Surrogate 是什麼？

它是 `dllhost.exe`，一個在使用它的程式之外代管元件的 Windows 處理程序。當掉的影響只留在裡面。檔案總管用它處理縮圖，其他程式也會用到。

### 為什麼有這麼多 COM Surrogate 處理程序？

每個副本代管一個元件，所以同時有好幾個是正常的。很多在閒置一陣子後會自己結束。

### 可以結束 COM Surrogate 嗎？

可以，結束卡住的副本是安全的，需要的時候 Windows 會再啟動一個新的。如果同一個副本一再變忙，就去找它的元件 ID，不要一直結束它。

### 為什麼說檔案已在 COM Surrogate 中開啟？

有縮圖處理常式正在讀那個檔案。關閉資料夾和任何預覽窗格，等幾秒再試。如果同一種檔案一再發生，就開啟**一律顯示圖示，不要顯示縮圖**來確認原因。

### COM Surrogate 是病毒嗎？

真正的那個檔案不是。確認它是從 `C:\Windows\System32` 或 `C:\Windows\SysWOW64` 執行，並由 Microsoft Windows 簽署，再看它代管的是哪個元件。


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