WIA-TWAIN 互換性
デバイスに 2 つ以上のドライバーを含めることができる場合は、これらのドライバーの相互互換性を十分にテストします。 たとえば、あるドライバーがデバイスを使用できない状態 (ドライバーが一部のプロトコルでセッション終了メッセージを送信していないなど) の場合、デバイスとの通信を試みると、もう一方のドライバーが失敗する可能性があります。 この状況は、多くの場合、シリアル デバイスで発生します。
同じDLL内の WIA と TWAIN
1 つの DLL から WIA ドライバーと TWAIN ドライバーを同時に実行している場合、WIA サービスと TWAIN アプリケーションの両方がこの DLL のインスタンスを読み込みます。 DLL の WIA インスタンスは、WIA 項目ツリーを構築します。 このツリーは、カメラ上のフォルダーと画像を表します。 WIA を使用するアプリケーション (マイ コンピューターやスキャナー、カメラ ウィザードなど) には、ドライバーに項目ツリーのコピーが含まれます。
TWAIN ドライバーによってイメージが削除または追加された場合、WIA ドライバーにはこの変更が通知されません。 その結果、WIA 項目ツリーには、削除されたイメージが含まれるか、追加されたイメージが含まれません。 いずれの場合も、ドライバーは項目ツリーを更新する必要があります。 これを行うには、TWAIN ドライバーは、イメージが追加または削除されたときに、その項目ツリーを更新する WIA ドライバーを注文する必要があります。
これを行う 1 つの方法は、TWAIN ドライバーから CoCreateInstance(CLSID_IWiaDevMgr,...) を呼び出し、すべてのデバイスを列挙し、デバイスを検索することです。 このリストを使用してドライバーを識別する 1 つの方法は、TWAIN ドライバーがこのプロパティに対してクエリを実行し、それが存在する場合、それが WIA ドライバーであることを知ることができるように、WIA ドライバーにカスタム プロパティを作成することです。 ドライバーの IWiaItem を取得したら、そのツリーを再構築するコマンドをドライバーに送信します (たとえば、IWiaItem::DeviceCommand メソッドの呼び出しでWIA CMD_SYNCHRONIZEコマンドを送信します)。 CoCreateInstance、 IWiaDevMgr、および IWiaItem については、Microsoft Windows SDK のドキュメントで説明されています。
WIA 項目ツリーを更新するもう 1 つの方法は、WIA ドライバーで名前付き イベント を作成することです。 WIA ドライバーのスレッドは、このイベントが通知されるまで待機できます。 TWAIN ドライバーを使用してイメージを削除または追加するたびに、TWAIN ドライバーは、この名前付きイベントに対して (Windows SDK ドキュメントで説明されている) SetEventを呼び出すことによって通知します。 WIA ドライバーのスレッドが解放され、WIA ドライバーによってツリーが再構築されます。
どちらの方法でも、カメラまたはスキャナー上の実際の画像に加えられた変更が反映されるように、ツリーを再構築する必要があります。 項目ツリーの項目を追加または削除してツリーを更新するたびに、イベントをキューに登録します (たとえば、WIA_EVENT_ITEM_DELETEDやWIA_EVENT_TREE_UPDATED (これらの WIA イベント識別子とその他の WIA イベント識別子の説明については、Windows SDK のドキュメントを参照してください)。 ツリーが変更されたときにイベントを正常に送信すると、My Computer やその他の WIA アプリケーションが自動的に更新されない問題が解決されます。
注: TWAIN ドライバーと WIA ドライバーは同じ DLL に存在する可能性があります。ただし、WIA ドライバーと TWAIN ドライバーは同じ UI を共有できません。 各ドライバーには、独自の UI が必要です。