Repository navigation
Windows:残留的文件关联处理器返回 E_FAIL,导致 DSH 整个“打开方式”列表失败(IAssocHandler::GetName) #8019
EmotionTowel
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
问题概述
在 Windows 11 24H2/25H2 中,Windows 移除 WordPad 后遗留了一个失效的文件关联处理器。这个处理器会导致 DSH 对所有文件类型的“打开方式”查询失败。
实际调用过程如下:
SHAssocEnumHandlers成功返回处理器枚举器;IEnumAssocHandlers::Next成功返回多个有效处理器,包括 Typora;IAssocHandler::GetName/GetUIName返回E_FAIL;@deepseek-ai/dsh-native-command没有隔离单个处理器的 COM 异常,导致整个应用列表查询被中断。在 Web UI 中表现为:
“使用默认应用打开”本身仍然正常,因为该路径直接交给 Explorer,不需要枚举全部文件关联处理器。
测试环境
0.1.7-rc.2@deepseek-ai/dsh-native-command26200.9457,x64.md、.txt、.png、.exe上均可复现残留注册表状态
Windows 11 24H2 移除了 WordPad,但系统中仍保留以下应用注册:
但目标程序已经不存在:
本机还发现以下 WordPad 残留项:
HRESULT 逐步定位
使用保留每个 HRESULT 的小型 COM 探针,得到:
以
.md为例,在失败之前已经成功枚举到:因此,
SHAssocEnumHandlers本身没有失败。真正的问题是:枚举到后面的某一个失效处理器时失败了。DSH 当前行为
packages/util/native-command/src/file-applications-windows.ts中的Visit()调用每个处理器的回调时,没有隔离单个处理器的 COM 异常:List()随后调用IAssocHandler::GetName和GetUIName。由于这些 COM 方法使用 HRESULT 异常封送,残留 WordPad 处理器的失败会终止整个 PowerShell 查询。最终错误等价于:
复现步骤
Applications\WORDPAD.EXE注册项仍然存在;nativeFileApplications(path, signal);HKLM\SOFTWARE\Classes\Applications\WORDPAD.EXE注册项后重新测试;影响范围
该问题不只影响 Markdown 或 Typora。
只要某个扩展名的处理器列表中包含这个残留 WordPad 处理器,查询就可能失败。在测试机上,以下扩展名都在失败位置中断:
同时已确认,问题与 PowerShell 版本无关:
-EncodedCommand传输方式:失败。建议修复
将每个 Shell 处理器视为独立项;单个处理器失败时只跳过该处理器:
也可以只在
List()中捕获GetName/GetUIName周围的 COM 异常。建议增加回归测试:模拟一个
GetName返回E_FAIL的处理器,并验证后续有效处理器仍然会出现在结果中。修复行为验证
跳过残留 WordPad 处理器后:
在报告者的机器上,删除残留的 WordPad 应用注册后无需修改 DSH 代码即可恢复。因此,这更像是 Windows 升级/卸载后的注册表残留与 DSH 容错不足之间的兼容问题,而不是 Typora 关联注册问题。
All reactions