WIA 微型驱动程序故障排除

默认情况下,WIA 服务会将错误记录到 windir% 目录中名为 wiadebug.log% 的文件。 WIA 服务在此文件中放置的信息在驱动程序开发过程中非常有用。 以下示例描述了一个典型问题,并演示如何使用 wiadebug.log 文件中的信息来查找问题的解决方案。

开发人员编写应用程序来测试正在开发的扫描程序驱动程序。 作为其中一项测试,开发人员尝试将扫描仪的每英寸点数 (dpi) 设置为 1200,但注意到此操作会产生错误。 查看 Wiadebug.log 文件会显示以下内容:

wiasGetChangedValueLong, validate prop 6147 failed hr: 0x80070057
wiasUpdateScanRect, CheckXResAndUpdate failed (0x80070057)
CDrvWrap::WIA_drvValidateItemProperties, Error calling driver:
drvValidateItemProperties with hr = 0x80070057 (This is normal if the app wrote an invalid value)

这些日志条目指示驱动程序报告应用程序写入了无效值。 从这些信息中还不清楚确切的问题是什么。 如果开发人员提高 WIA 日志记录级别来报告警告和错误, wiadebug.log 生成如下所示的输出:

wiasValidateItemProperties, invalid LIST value for : 
    (propID) Horizontal Resolution, value = 1200
Valid values are:
    75
    100
    150
    200
    300
    600
 wiasGetChangedValueLong, validate prop 6147 failed hr: 0x80070057
wiasUpdateScanRect, CheckXResAndUpdate failed (0x80070057)
 CDrvWrap::WIA_drvValidateItemProperties, Error calling driver: 
 drvValidateItemProperties with hr = 0x80070057 (This is normal if the app wrote an invalid value)

输出显示“水平分辨率”属性导致失败。 应用程序尝试将分辨率设置为 1200,但支持的分辨率列表不包括 1200。 因此,WIA 服务验证帮助程序 wiasValidateItemProperties 会拒绝设置此值的请求。

确定问题后,由开发人员确定是必须修改的驱动程序还是应用程序。 如果扫描仪的规格允许它支持 100 到 1400 dpi 之间的所有分辨率,则驱动程序应能够处理 1200 dpi 的请求。 如果扫描程序不支持此设置,则应更改应用程序,以便它不会尝试将水平分辨率设置为对此属性无效的值。 在这种情况下,应用程序在尝试将属性设置为此值之前,应检查值有效。

日志记录级别由注册表中的条目控制。 对于 WIA,此密钥驻留在以下位置:

HKLM\System\CurrentControlSet\Control\StillImage\Debug\MODULE_NAME\DebugFlags

在此示例中,MODULE_NAME 是相应二进制模块的名称。 对于 WIA 服务,这是 wiaservc.dllDebugFlags 中的值控制日志记录级别。 下表提供了其中三个设置:

含义
0x00000001 显示错误消息。
0x00000002 显示警告消息。
0x00000004 显示跟踪消息。

DebugFlags 中的值是一个标志值, (,即不同的设置可以与按位 OR 运算符) 组合。 若要一次性启用错误、警告和跟踪日志记录,请将 DebugFlags 设置为 0x0000007。

为了使 DebugFlags 的值更改生效,必须停止 WIA 服务 (stisvc) ,然后重新启动。 有关详细信息 ,请参阅启动和停止静止图像服务

过多的日志记录可能会导致性能显著降低。 仅当尝试解决特定问题时,才应提高日志记录级别。 更正问题后,将日志记录设置为其原始级别。 默认日志记录级别为 1。 不要将日志记录级别提高到 3 以上,否则可能会导致崩溃。