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

为何通过Windows Image Acquisition查询时HP扫描仪被识别为相机?

问题:WIA将HP扫描仪识别为Camera类型,Windows扫描工具却能正常识别为扫描仪

我通过USB连接了两台扫描仪(一台EPSON,一台HP),Windows扫描和传真工具可正常识别二者为扫描仪,但在C++程序中通过Windows Image Acquisition(WIA)查询设备属性时,HP扫描仪被标记为“Camera”类型,EPSON扫描仪则被正确识别为Scanner类型。

两台设备的部分Device Information Properties输出

Device ID: {6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0000
Vendor Description: EPSON
Device Description: EPSON DS-1630
Device Type: Scanner
Device Port Name: \\.\Usbscan1
Device Name: EPSON DS-1630

Device ID: {6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0001
Vendor Description: HP
Device Description: HP ENVY 5000 (USB)
Device Type: Camera
Device Port Name: \\.\Usbscan0
Device Name: HP ENVY 5000 (USB)

Windows扫描和传真工具识别界面

Windows扫描和传真工具界面

导出设备信息的C++代码

#include <Windows.h>
#include <stdio.h>
#include <wia.h>

int main(int argc, char **argv) {
  argc;
  argv;

  HRESULT hr = CoInitialize(NULL);
  if (FAILED(hr)) {
    fprintf(stderr, "CoInitializeEx failed\n");
    goto cleanup;
  }

  IWiaDevMgr2 *dev_mgmt;
  hr = CoCreateInstance(CLSID_WiaDevMgr2, NULL, CLSCTX_LOCAL_SERVER,
                        IID_IWiaDevMgr2, (void **)&dev_mgmt);
  if (FAILED(hr)) {
    fprintf(stderr, "CoCreateInstance failed\n");
    goto cleanup;
  }

  IEnumWIA_DEV_INFO *dev_info = NULL;
  hr = dev_mgmt->EnumDeviceInfo(WIA_DEVINFO_ENUM_LOCAL, &dev_info);
  if (FAILED(hr)) {
    fprintf(stderr, "EnumDeviceInfo Failed\n");
    dev_mgmt->Release();
    goto cleanup;
  }

  while (hr == S_OK) {

    IWiaPropertyStorage *prop_storage = NULL;

    hr = dev_info->Next(1, &prop_storage, NULL);
    if (FAILED(hr)) {
      break;
    }

    if (hr == S_OK) {

      PROPSPEC prop_spec[6] = {0};
      PROPVARIANT prop_var[6] = {0};

      const ULONG prop_count = sizeof(prop_spec) / sizeof(prop_spec[0]);

      // Device ID, VT_BSTR
      prop_spec[0].ulKind = PRSPEC_PROPID;
      prop_spec[0].propid = WIA_DIP_DEV_ID;

      // Vendor Description, VT_BSTR
      prop_spec[1].ulKind = PRSPEC_PROPID;
      prop_spec[1].propid = WIA_DIP_VEND_DESC;

      // Device Description, VT_BSTR
      prop_spec[2].ulKind = PRSPEC_PROPID;
      prop_spec[2].propid = WIA_DIP_DEV_DESC;

      // Device Type, VT_I4
      prop_spec[3].ulKind = PRSPEC_PROPID;
      prop_spec[3].propid = WIA_DIP_DEV_TYPE;

      // Device Port Name, VT_BSTR
      prop_spec[4].ulKind = PRSPEC_PROPID;
      prop_spec[4].propid = WIA_DIP_PORT_NAME;

      // Device Name, VT_BSTR
      prop_spec[5].ulKind = PRSPEC_PROPID;
      prop_spec[5].propid = WIA_DIP_DEV_NAME;

      hr = prop_storage->ReadMultiple(prop_count, prop_spec, prop_var);
      if (FAILED(hr)) {
        fprintf(stderr, "prop_storage->ReadMultiple failed");
        break;
      }

      fprintf(stderr, "\nDevice ID: %S\n", prop_var[0].bstrVal);
      fprintf(stderr, "Vendor Description: %S\n", prop_var[1].bstrVal);
      fprintf(stderr, "Device Description: %S\n", prop_var[2].bstrVal);

      if (prop_var[3].iVal == 0x0000) {
        fprintf(stderr, "Device Type: Default\n");
      } else if (prop_var[3].iVal == 0x0001) {
        fprintf(stderr, "Device Type: Scanner\n");
      } else if (prop_var[3].iVal == 0x0002) {
        fprintf(stderr, "Device Type: Camera\n");
      } else if (prop_var[3].iVal == 0x0003) {
        fprintf(stderr, "Device Type: Video\n");
      } else {
        fprintf(stderr, "Device Type: Unknown (%d)\n", prop_var[3].iVal);
      }

      fprintf(stderr, "Device Port Name: %S\n", prop_var[4].bstrVal);
      fprintf(stderr, "Device Name: %S\n", prop_var[5].bstrVal);

      FreePropVariantArray(prop_count, prop_var);
      prop_storage->Release();
      prop_storage = NULL;
    }
  }

  dev_info->Release();
  dev_mgmt->Release();

cleanup:
  CoUninitialize();
}

内容的提问来源于stack exchange,提问作者EndlessFlapjacks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:22:24