Почему один из моих сканеров отображается как камера при запросе к нему с помощью Windows Image Acquisition (WIA)?C++

Программы на C++. Форум разработчиков
Anonymous
Почему один из моих сканеров отображается как камера при запросе к нему с помощью Windows Image Acquisition (WIA)?

Сообщение Anonymous »

У меня есть два сканера, подключенных к моей машине через USB (EPSON и HP). Утилита Windows Scan and Fax, похоже, уверена, что оба устройства являются сканерами, как и ожидалось. Однако когда я запрашиваю устройства WIA в своей системе и распечатываю их свойства в программе C++, сканер HP отображается как тип «Камера». Сканер EPSON правильно указывается как сканер.
Вот выходные данные нескольких свойств информации об устройстве с обоих устройств:
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)

Изображение

Ниже приведен код, который я использую для вывода этой информации:
#include
#include
#include

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();
}



Подробнее здесь: https://stackoverflow.com/questions/786 ... windows-im

Вернуться в «C++»