You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用WIA连接扫描仪时出现0x80070021 HRESULT异常求助

解决WIA连接扫描仪时的0x80070021锁定异常

我碰到过不少开发者遇到这个问题,虽然错误提示是“进程无法访问文件,因为另一个进程已锁定文件的一部分”,但在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:22