# COM Surrogate 是什么，为什么一直在运行

COM Surrogate 是 Windows 的正常进程，也就是 `C:\Windows\System32` 里的 `dllhost.exe`，它把组件放到单独的进程里运行，这样组件出了问题，也不会拖垮调用它的程序，平时看到它，多半是文件资源管理器在生成缩略图。同时有好几个是正常的，浏览文件夹时一会儿出现一会儿消失也是正常的，一直很忙，或者提示文件“已在 COM Surrogate 中打开”，通常是某个缩略图处理程序或者某个坏文件的问题。

## 它为什么存在

Windows 程序经常以 DLL 里的 COM 组件形式加载额外的代码，DLL 在程序里崩了，整个程序也跟着崩。Raymond Chen 在 [微软的 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 都很高 | 有一个损坏的媒体文件，或者解码器处理它时出错 | 分批把文件移出去找到它，再更新或卸载解码器包 |
| “操作无法完成，因为文件已在 COM Surrogate 中打开” | 缩略图处理程序还占着这个文件 | 关掉预览窗格和文件夹，等几秒再试 |
| 一直崩溃或者提示“已停止工作” | 第三方组件有问题 | 按上面的办法查 ID，再更新或卸载那个软件 |
| 缩略图不对或者过时 | 缩略图缓存损坏 | 在磁盘清理里清“缩略图”，见 [磁盘清理和存储感知怎么选](/zh/windows/blog/disk-cleanup-vs-storage-sense-windows) |

想彻底不生成缩略图，打开“文件资源管理器 › 查看更多（…）› 选项 › 查看”，勾选“始终显示图标，从不显示缩略图”，负担没了，文件夹里也就看不到图片预览了，这同时也是个好办法来验证原因，问题消失就说明确实是缩略图。

## 它是不是病毒

真的那个是微软签名的文件，在 `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 合成一行，CPU 和内存是所有副本加起来的。在这一行的菜单里选“为什么在运行？”，能看到占用最高的几个副本和它们的 PID、CPU、内存，还有“可执行文件”和启动它的进程，以你自己的账户、没有提权运行的副本还会显示“命令”和其中的 `/Processid`，不用去任务管理器加列，点一个副本可以看它自己的详情。COM Surrogate 从 Windows 文件夹运行，所以 Mole 把它标成系统进程，不提供“终止”和“强制退出”，要结束卡住的副本就用任务管理器。Mole 不修缩略图处理程序，清理页也没有缩略图缓存这一项，这件事交给磁盘清理。想多了解一些，可以看 [Windows 常见进程都是干什么的](/zh/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/zh/windows/blog/com-surrogate-dllhost
