Совместимость WIA-TWAIN
Если устройство может иметь два или более драйверов, тщательно протестируйте эти драйверы на совместимость друг с другом. Например, если один драйвер оставляет устройство в непригодном для использования состоянии (например, драйвер не отправляет сообщение о закрытии сеанса в каком-то протоколе), другой драйвер может завершиться ошибкой при попытке связаться с устройством. Такая ситуация часто возникает с последовательными устройствами.
WIA и TWAIN в одной библиотеке DLL
Если вы используете драйвер WIA и драйвер TWAIN одновременно из одной библиотеки DLL, служба WIA и приложение TWAIN будут загружать экземпляр этой библиотеки DLL. Экземпляр WIA библиотеки DLL создаст дерево элементов WIA. Это дерево представляет папки и изображения на камере. Любое приложение, использующее WIA (например, Мой компьютер или Мастер сканера и камеры), будет иметь копию дерева элементов в драйвере.
При удалении или добавлении образа с помощью драйвера TWAIN драйвер WIA не получает уведомление об этом изменении. В результате дерево элементов WIA будет содержать изображения, которые были удалены, или не будет содержать добавленные изображения. В любом случае драйвер должен обновить дерево элементов. Для этого драйвер TWAIN должен приказать драйверу WIA обновить дерево элементов при добавлении или удалении образа.
Одним из способов этого является вызов CoCreateInstance(CLSID_IWiaDevMgr,...) из драйвера TWAIN, перечисление всех устройств и поиск устройства. Один из способов идентифицировать драйвер с помощью этого перечисления — создать пользовательское свойство в драйвере WIA, чтобы если драйвер TWAIN запросит это свойство и оно существует, вы будете знать, что это ваш драйвер WIA. После получения IWiaItem для драйвера отправьте драйверу команду для перестроения его дерева (например, отправьте ему команду wia CMD_SYNCHRONIZE в вызове метода IWiaItem::D eviceCommand ). CoCreateInstance, IWiaDevMgr и IWiaItem описаны в документации по Microsoft Windows SDK.
Другим способом обновления дерева элементов WIA является создание именованного события в драйвере WIA. Затем поток в драйвере WIA может ожидать передачи сигнала об этом событии. Всякий раз, когда вы удаляете или добавляете образ с помощью драйвера TWAIN, драйвер TWAIN сигнализирует (путем вызова SetEvent (описано в документации windows SDK)) для этого именованного события. Поток в драйвере WIA будет освобожден, а драйвер WIA перестроит дерево.
В любом случае необходимо перестроить дерево таким образом, чтобы оно отражало любые изменения, внесенные в фактические изображения на камере или сканере. Убедитесь, что при каждом обновлении дерева путем добавления или удаления элемента из дерева элементов событие помещалось в очередь (например, WIA_EVENT_ITEM_DELETED или WIA_EVENT_TREE_UPDATED (описание этих и других идентификаторов событий WIA см. в документации windows SDK)). Если вы успешно отправите событие при изменении дерева, это решит проблему, связанную с тем, что "Мой компьютер" и другие приложения WIA не обновляются автоматически.
Примечание Хотя драйверы TWAIN и WIA могут находиться в одной библиотеке DLL, драйверы WIA и TWAIN не могут совместно использовать один и тот же пользовательский интерфейс. Каждый драйвер должен иметь собственный пользовательский интерфейс.