使用WIA连接扫描仪时出现0x80070021 HRESULT异常求助
我碰到过不少开发者遇到这个问题,虽然错误提示是“进程无法访问文件,因为另一个进程已锁定文件的一部分”,但在WIA扫描仪场景下,这通常不是真的文件问题,而是设备资源被占用或者WIA服务/驱动异常导致的。结合你的情况(单独扫描正常、设备未处于连接状态),可以按以下步骤排查解决:
结束扫描仪厂商的后台监控进程
很多扫描仪品牌(比如惠普、爱普生)会自带常驻后台的扫描辅助程序,它们会持续占用WIA设备的访问权,导致你的代码无法连接。打开任务管理器,找到类似HP Scan、EPSON Event Manager这类进程,结束后再重试代码。重启Windows Image Acquisition (WIA)服务
WIA服务负责管理图像设备的连接,偶尔会出现资源泄漏或状态异常。按下Win+R输入services.msc,找到**Windows Image Acquisition (WIA)**服务,右键选择“重启”,之后再运行你的代码。优化代码的COM资源释放
WIA是基于COM的组件,如果代码中没有正确释放设备对象,会导致资源残留,下次连接时触发锁定。建议在代码中添加finally块释放COM资源,同时先过滤出扫描仪设备(避免误连摄像头等其他WIA设备):WIA.DeviceManager manager = new WIA.DeviceManager(); WIA.Device device = null; try { foreach (WIA.DeviceInfo info in manager.DeviceInfos) { // 只连接扫描仪类型的设备 if (info.Type == WIA.WiaDeviceType.ScannerDeviceType) { device = info.Connect(); break; } } // 执行扫描操作... } catch (Exception ex) { Console.WriteLine($"连接失败: {ex.Message}, HRESULT: {ex.HResult:X8}"); } finally { // 释放COM对象,避免资源泄漏 if (device != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(device); device = null; } if (manager != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(manager); manager = null; } }以管理员身份运行程序
有时候UAC权限限制会导致程序无法获取设备的独占访问权,右键你的程序或IDE,选择“以管理员身份运行”再测试。重装扫描仪驱动
如果以上方法都无效,可能是WIA驱动损坏导致的兼容性问题。卸载当前扫描仪驱动,去厂商官网下载最新的支持WIA协议的驱动重新安装,安装后重启电脑再测试。
内容的提问来源于stack exchange,提问作者Angappan.S

