UWP中MostRecentlyUsedList添加操作引发COM类型异常求助
我之前踩过这个一模一样的坑!当尝试把StorageFile添加到MostRecentlyUsedList时抛出Exception HRESULT E_FAIL has been returned from a call to a COM component,结合你的调用栈来看,大概率是这几个常见问题导致的,给你整理下排查和修复方案:
1. 文件权限不足
UWP对文件访问的权限管控非常严格,如果你的StorageFile不是通过**文件选择器(FileOpenPicker/FolderPicker)**获取的,或者没有在应用清单中声明对应文件夹的访问权限,系统会拒绝将其加入MRU列表。
- 修复方案:
- 优先通过
FileOpenPicker获取用户选择的文件,这种方式会自动获得持久化的访问权限; - 如果是访问已知文件夹(如Documents、Pictures),务必在
Package.appxmanifest中勾选对应的权限声明。
- 优先通过
2. 文件实例失效或不存在
如果文件已经被删除、移动,或者StorageFile对象已经过期(比如长时间未使用导致的缓存失效),调用Add方法就会触发E_FAIL异常。
- 修复方案:
- 在调用
Add之前,先检查file.IsAvailable属性,确认文件当前是可访问状态; - 用
try-catch包裹添加逻辑,捕获异常后重新通过合法路径获取文件实例。
- 在调用
3. MRU列表容量已满
系统默认的MRU列表有数量上限(默认是25个项目),如果列表已经存满,再添加新项就会失败。
- 修复方案:
- 调用
StorageItemMostRecentlyUsedList.GetItems(0)获取当前所有MRU项,当数量接近上限时,移除最早的几个旧项; - 也可以通过
StorageItemMostRecentlyUsedList的构造函数自定义容量上限。
- 调用
4. 线程调度问题
从你的调用栈能看到用到了DispatcherHelper,虽然MRU操作理论上支持后台线程,但部分COM组件调用要求必须在UI线程执行。如果调度逻辑有问题,也可能触发E_FAIL。
- 修复方案:
- 确认调用
Add方法的代码确实被调度到了UI线程; - 可以直接用
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync来调度,确保线程环境正确。
- 确认调用
你的异常信息及调用栈:
异常信息为:Exception HRESULT E_FAIL has been returned from a call to a COM component。
调用栈如下:
at Windows.Storage.AccessCache.StorageItemMostRecentlyUsedList.Add(IStorageItem file, String metadata, RecentStorageItemVisibility visibility)
at FluentVideoPlayer.Helpers.FileHelper.<>c__DisplayClass7_0.b__0()
at Microsoft.Toolkit.Uwp.Helpers.DispatcherHelper.<>c__DisplayClass10_0`1.b__0()
内容的提问来源于stack exchange,提问作者Muhammad Touseef

