USB デバイス用 Windows アプリケーション開発の概要
要約:
- 適切なプログラミング モデルを選択するためのガイドライン
- UWP アプリとデスクトップ アプリの開発者エクスペリエンス
重要な API:
この記事では、USB デバイスと通信するために UWP アプリと Windows デスクトップ アプリのどちらを作成するかを決定するためのガイドラインを示します。
Windows には、カスタム USB デバイスと通信するアプリの作成に使用できる API セットが用意されています。 この API は、デバイスの検索、データ転送など、一般的な USB 関連タスクを実行します。
この文脈におけるカスタム デバイスとは、Microsoft がインボックス クラス ドライバーを提供していないデバイスを意味します。 代わりに、デバイス ドライバーとして WinUSB (Winusb.sys) をインストールできます。
プログラミング モデルの選択
Winusb.sys をインストールする場合、プログラミング モデルのオプションは次のとおりです。
-
Windows 8.1 には、Windows.Devices.Usb 名前空間が提供されていますが、これはそれより前のバージョンの Windows では使用できません。 その他の Microsoft Store リソースについては、「ユニバーサル Windows プラットフォームのドキュメント」を参照してください。
-
Windows 8.1 以前では、Winusb.sys を介して通信していたアプリは、WinUSB 関数を使用して作成されたデスクトップ アプリでした。 Windows 8.1 では、API セットが拡張されました。 Windows アプリ開発の詳細については、「Windows 向けの開発」を参照してください。
最適なプログラミング モデルを選択する方法は、さまざまな要因によって左右されます。
アプリで内部 USB デバイスと通信するかどうか。
API は、主に周辺機器にアクセスするように設計されています。 この API は、PC の内部 USB デバイスにアクセスすることもできます。 ただし、UWP アプリから PC の内部 USB デバイスへのアクセスは、その PC の OEM によってデバイス メタデータで明示的に宣言されている特権アプリに限定されます。
アプリで USB 等時性エンドポイントと通信するかどうか。
アプリと、デバイスの等時性エンドポイントとの間でデータのやりとりを行う場合は、Windows デスクトップ アプリを作成する必要があります。 Windows 8.1 では、デスクトップ アプリがアイソクロナス エンドポイントとの間でデータを送受信するための API セットに新しい WinUSB 関数が追加されました。
アプリが "コントロール パネル" タイプのアプリであるかどうか。
UWP アプリはユーザーごとのアプリであり、各アプリのスコープ外で変更を加える機能はありません。 これらの種類のアプリの場合、Windows デスクトップ アプリを作成する必要があります。
USB デバイス クラスが、UWP アプリでサポートされているクラスであるかどうか。
デバイスがいずれかのデバイス クラスに属している場合は、UWP アプリを作成します。
name:cdcControl, classId:02 * *
name:physical, classId:05 * *
name:personalHealthcare, classId:0f 00 00
name:activeSync, classId:ef 01 01
name:palmSync, classId:ef 01 02
name:deviceFirmwareUpdate, classId:fe 01 01
name:irda, classId:fe 02 00
name:measurement, classId:fe 03 *
name:vendorSpecific, classId:ff * *
Note
デバイスが DeviceFirmwareUpdate クラスに属している場合、アプリは特権アプリである必要があります。
デバイスが上記のデバイス クラスのいずれにも属していない場合は、Windows デスクトップ アプリを作成します。
ドライバーの要件
ドライバーの要件 | UWP アプリ | Windows デスクトップ アプリ |
---|---|---|
関数ドライバー | Microsoft が提供する Winusb.sys (カーネル モード ドライバー)。 | Microsoft が提供する Winusb.sys (カーネル モード ドライバー)。 |
フィルター ドライバー | フィルター ドライバーが存在する場合、アクセスは特権アプリに限定されます。 アプリは、OEM によってデバイス メタデータ内で特権アプリとして宣言されます。 | フィルター ドライバーは、Winusb.sys へのアクセスをブロックしない限り、カーネル モードのデバイス スタックに存在することができます。 |
コード サンプル
サンプル | UWP アプリ | Windows デスクトップ アプリ |
---|---|---|
これらのサンプルを試してみる |
|
開発ツール
開発ツール | UWP アプリ | Windows デスクトップ アプリ |
---|---|---|
開発者環境 | Microsoft Visual Studio 2013 Windows 8.1 用 Microsoft Windows ソフトウェア開発キット (SDK) |
Visual Studio (Ultimate または Professional) および Windows Driver Kit (WDK) 8 以降に含まれている WinUSB アプリケーション テンプレートを使用します。 アイソクロナス転送の場合は、Visual Studio 2013 と Windows Driver Kit (WDK) 8.1以降。 |
プログラミング言語 | C#、VB.NET、C++、JavaScript | C/C++ |
機能の実装
主要シナリオ | UWP アプリ | Windows デスクトップ アプリ |
---|---|---|
デバイスの検出 | Windows.Devices.Enumeration 名前空間を使用して UsbDevice を取得します。 | SetupAPI と WinUsb_Initialize を使用して、WINUSB_INTERFACE_HANDLE を取得します。 |
USB コントロール転送 | UsbSetupPacket UsbControlRequestType UsbDevice.SendControlInTransferAsync UsbDevice.SendControlOutTransferAsync |
WINUSB_SETUP_PACKET WinUsb_ControlTransfer |
USB 記述子の取得 | UsbDevice.DeviceDescriptor UsbConfiguration.Descriptors UsbInterface.Descriptors UsbEndpointDescriptor |
WinUsb_GetDescriptor |
USB 一括転送の送信 | UsbBulkInPipe UsbBulkOutPipe |
WinUsb_ReadPipe WinUsb_WritePipe |
USB 割り込み転送の送信 | UsbInterruptInPipe UsbInterruptOutPipe |
WinUsb_ReadPipe WinUsb_WritePipe |
USB 等時性転送の送信 | サポートされていません。 | WinUsb_ReadIsochPipe WinUsb_ReadIsochPipeAsap WinUsb_WriteIsochPipe WinUsb_WriteIsochPipeAsap |
デバイスを閉じる | UsbDevice.Close | WinUsb_Free |
ドキュメント
ドキュメント | UWP アプリ | Windows デスクトップ アプリ |
---|---|---|
プログラミング ガイド | USB デバイスとの対話、開始から終了まで | WinUSB 関数を使用して USB デバイスにアクセスする方法 |
API リファレンス | Windows.Devices.Usb | WinUSB 関数 |