USB デバイス用 Windows アプリケーション開発の概要

要約:

  • 適切なプログラミング モデルを選択するためのガイドライン
  • UWP アプリとデスクトップ アプリの開発者エクスペリエンス

重要な API:

この記事では、USB デバイスと通信するために UWP アプリと Windows デスクトップ アプリのどちらを作成するかを決定するためのガイドラインを示します。

Windows には、カスタム USB デバイスと通信するアプリの作成に使用できる API セットが用意されています。 この API は、デバイスの検索、データ転送など、一般的な USB 関連タスクを実行します。

この文脈におけるカスタム デバイスとは、Microsoft がインボックス クラス ドライバーを提供していないデバイスを意味します。 代わりに、デバイス ドライバーとして WinUSB (Winusb.sys) をインストールできます。

プログラミング モデルの選択

Winusb.sys をインストールする場合、プログラミング モデルのオプションは次のとおりです。

最適なプログラミング モデルを選択する方法は、さまざまな要因によって左右されます。

  • アプリで内部 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 を取得します。 SetupAPIWinUsb_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 関数