USB 双方向エクステンダー

重要

プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。

詳細については、プリントサポートアプリデザインガイド.

Windows では、製造元は、双方向 XML ファイルと USB 双方向エクステンダーと呼ばれる Javascript ファイルの組み合わせを使用して、USB デバイスの双方向通信をサポートすることができます。

USB 双方向エクステンダーを使用することで、アプリケーションは、USB のデータ転送に双方向通信を使用することができます。 この Javascript の実装では、デバイス フロー制御や、印刷中の印刷ジョブによる制御情報の多重化はサポート対象外です。

既定では、Bidi (双方向) クエリと状態要求は、印刷に使用される USB デバイス インターフェイス経由でルーティングされます。 これにより、getSchemas JavaScript メソッドを使用した完全な双方向通信の状態と、setSchema JavaScript メソッドを使用した Set 操作が可能になります。 印刷デバイスに印刷ジョブが送信されていない間は、完全な双方向通信が可能です。

印刷中は、印刷ジョブ データによって書き込み処理はブロックされるため、getStatus メソッドは、読み取りチャネルのみを使用して、デバイスから自動的に送信されてくる状態を取得します。 ただし、デバイスがセカンダリ USB インターフェイスをサポートしている場合、requestStatus メソッド関数は、デバイスの印刷中もプリンターから状態を取得します。

Windows 8.1 では、v4 ドライバー モデルが拡張され、ホスト ベースのデバイスがサポートされています。 また、USBMon が更新され、IHV が JavaScript コードを使用して印刷パスをより適切に制御し、印刷ジョブベースのアクションを実行できるようになりました。 この更新には、新しい Bidi JavaScript エントリ ポイントを提供する API の追加が含まれています。 これらの API は、USBMon の既存の関数と連携します。

startPrintJob。 この新しい関数は、USBMon の startDocPort に合わせて配置されます。 ホスト ベースの印刷デバイスに接続されているポートで新しい各 USB 印刷ジョブが開始されると、USBMon は IHV 提供の JavaScript を呼び出して、必要なジョブ前の処理を実行できるようにします。 これには、「Job Property Bagでジョブ グローバル プロパティを設定する」、「デバイスに現在の状態と構成データを照会する」、「何もしない」を含みます。 完了したタスクは、デバイスと IHV に完全に依存します。

writePrintData。 この新しい関数は、USBMon の writePort に合わせて配置されます。 USBMon が印刷中にスプーラーから各 writePort 関数呼び出しを受信した場合、IHV JavaScript 関数を使用して、指定された印刷データをホスト ベースのデバイスに送信する必要があります。 これにより、IHV JS は、現時点でデバイスに送信する必要がある内容を決定できます。 IHV は、必要に応じて、データ バッファーの一部を削除、追加、または保存できます。 これにより、IHV は、デバイスに送信されるタイミングを完全に制御できます。 これにより、IHV が印刷ジョブの偶数ページのデータを(永続ストリームの 1 つに)保持し、すべてのデータがスプーラーから受信された後に処理する機会が与えられるため、手動での両面印刷にも対応することができます。 IHV は、printerBidiSchemaResponses オブジェクトを使用して、ジョブの処理中に印刷ジョブの状態またはデバイスの状態を返すこともできます。

endPrintJob。 この新しい関数は、USBMon の endDocPort に合わせて配置されます。 USBMon がホスト ベースの印刷デバイスに接続されているポートで各 USB 印刷ジョブの endDocPort 呼び出しを受信すると、USBMon は IHV が提供する JavaScript を呼び出して、必要なジョブ後の処理を実行できるようにします。 これには、保持されているデータのデバイスへの送信、Bidi スキーマ値を返し手動での両面印刷を開始することや、IHV/デバイスが必要とするその他の処理が含まれる可能性があります。

次の図は、USB 双方向拡張機能アーキテクチャの概要を示しています。このシナリオでは、USBPrint インターフェイスを介してデバイスから自動的に送信される状態を getStatus メソッドで取得します。

usb bidi extender architecture with getstatus method.

USB プリンターの操作の詳細については、「USB 印刷」を参照してください。

USB 双方向エクステンダー API リファレンス

USB 双方向エクステンダーの JavaScript コードは、印刷デバイスとの通信に次の関数を使用します:

  • getSchemas

  • setSchema

  • getStatus

  • requestStatus

  • startPrintJob

  • writePrintData

  • endPrintJob

これらの API の詳細については、「JavaScript API リファレンス」を参照してください。

USBMon Bidi (双方向) 拡張 XML スキーマ

USBMon 双方向拡張ファイルは、SNMP 双方向拡張ファイルおよび WSDMon 双方向拡張ファイルと同じ基本構造を使用します。 XML スキーマ ファイルは Windows Driver Kit で発行され、USBMon 双方向拡張ファイルは INFGate WHCK テスト中に自動的にスキーマ検証されます。 双方向拡張機能スキーマを開発して USB バスを使用する場合、次の情報に注意することが重要です:

  • 指定できる accessType の値は、Get、Set、GetSet のいずれかです。 これは、記述されたスキーマ要素が Bidi Get または Set 操作タイプでサポートされる場所を示します。

  • 値には queryKey を指定することができます。 これは、デバイスからデータを取得するための物理的な操作を示すために使用します。 印刷ドライバーの USB モニターと Bidi サンプル では、2 つの異なる queryKeys をサポートする USB デバイスを示しています。 同じ queryKey 配下のすべてのプロパティは、1 度の USB 読み取り/書き込み操作で取得できる必要があります。

  • Bidi API 呼び出しで Bidi 値が要求されると、即座ににポーリングが実施されます。 refreshInterval 値は、特定の Bidi スキーマ値の更新のためにデバイスをポーリングするタイミングを示す初期値です。 ポーリングを停止するまで、ポーリングの都度 refreshInterval 値が増加します。 次の数式は、refreshInterval のインクリメント方法を示したものです。

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

USBMon と USB Bidi 拡張ファイルの対話

新しい USB ポートが作成または開かれる都度、USBMon は、接続されているデバイスと関連付けられているドライバーに新しい Bidi 拡張機能ファイルと Bidi 拡張機能 JavaScriptfile が含まれているかどうかを確認します。 USBMon は、v4 ドライバー マニフェストまたはドライバー INI ファイルを検索してファイルの名前を取得します。 USBMon が関連するファイルを見つけた場合、それらのファイルを使用して、このデバイスでサポートされている拡張 Bidi スキーマ値の一覧を特定し、デバイスと通信して値を照会します。 この時点で USBMon は、既存の印刷スプーラー API を介して IHV 指定の Bidi スキーマ アクションをサポートします。

GitHub の Windows ドライバーのサンプル

USBMon 双方向XML ファイルのサンプル - USBMon 双方向拡張 XML ファイルのサンプルを提供します。 このサンプルでは、標準の Bidi スキーマ プロパティ DeviceInfo、Configuration、Memory を使用し、いくつかのカスタム拡張機能も定義しています。 詳細については、「プリンター ドライバーの USB モニターと Bidi のサンプル」を参照してください。

Bidi 拡張ファイルの詳細については、「双方向通信スキーマ」を参照してください。

USBMon Bidi JavaScript ファイルのサンプル。 このサンプルには、USBMon 双方向エクステンダー JavaScript ファイルが含まれています。 このサンプルでは、Bidi SET および GET 操作をサポートする方法と、プリンターの印刷中にイベントをリッスンする方法を示しています。 詳細については、「プリンター ドライバーの USB モニターと Bidi のサンプル」を参照してください。

デバッグ

対話型デバッグを有効にするには、次のレジストリ キーを作成します。 USB Bidi JavaScript の場合、デバッグを有効にする前に印刷スプーラーを再起動する必要があります。

Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

値の名前: EnableJavaScriptDebugging

型: DWORD

値: 1

スクリプトのデバッグは、前のセクションに示したレジストリ キーを作成し、ホスティング プロセスを再起動後、次の手順で行います:

  1. ホスト プロセスにデバッガーを手動でアタッチします。 USB Bidi JavaScript の場合、これは spoolsv.exe です。

  2. デバッガーをスクリプト デバッグ モードに設定します。

  3. すべて中断 (Ctrl + Alt + Break) を選択し、スクリプトの次の実行時にプロセスに割り込ませます。

  4. シナリオを実行して問題を再現します。

  5. デバッガーが JavaScript 関数に割り込んだら、必要なブレークポイントを設定し、コードを段階的に実行します。

双方向通信スキーマ

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

JavaScript API リファレンス

印刷ドライバーの USB モニターと Bidi サンプル

USB 印刷

v4 プリンター ドライバー接続