次の方法で共有


デバイス アクセス オブジェクトを実装する

このトピックでは、デバイス アクセス オブジェクトをインスタンス化し、それを使用してデバイスにアクセスする方法について説明します。 インスタンス化されたクラスは、IDeviceIoControl インターフェイスと ICreateDeviceAccessAsync インターフェイスを実装します。

手順

手順 1

デバイス アクセス オブジェクトをインスタンス化するには、まず CreateDeviceAccessInstance 関数を呼び出す必要があります。 CreateDeviceAccessInstance が成功した場合は、Wait メソッドを呼び出して、非同期操作が完了するまで待機できます。 Wait が成功した場合は、GetResult メソッドから IDeviceIoControl オブジェクト (または適切なエラー) を取得できます。

HRESULT
CMyServer::Initialize(
        PCWSTR   pszDeviceInterfacePath
    )

/*++
Routine Description:

    This routine is called to initialize the Device Access object.
    It's not part of the constructor as the initialization can fail.
    It opens the device and gets the IDeviceIoControl interface to the device instance
    via the broker.

Arguments:
    pszDeviceInterfacePath - the device interface string that needs to be opened

Return Value:

    HRESULT

--*/

{
    HRESULT hr;
    ICreateDeviceAccessAsync *pDeviceAccess;

     //
     // Here's the actual open call.  This will *fail* if your lowbox does
     // not have the capability mapped to the interface class specified.
     // If you are running this as normal user, it will just pass through to
     // create file.
     //

   hr = CreateDeviceAccessInstance(pszDeviceInterfacePath,
                                   GENERIC_READ|GENERIC_WRITE,
                                   &pDeviceAccess);

    if (FAILED(hr)) {
        return hr;
    }

    if (SUCCEEDED(hr)) {
        hr = pDeviceAccess->Wait(INFINITE);
    }

    if (SUCCEEDED(hr)) {
        hr = pDeviceAccess->GetResult(IID_IDeviceIoControl,
                                            (void **)&m_pDeviceIoControl);
    }

    pDeviceAccess->Release();

    return hr;
}

手順 2.

DeviceIoControlSync メソッドの呼び出しの例を次に示します。

IFACEMETHODIMP 
CMyServer::put_SevenSegmentDisplay(
    BYTE   value
    )
/*++

Routine Description:
    This routine puts the display value into the device.

Arguments:
    
    value - The value to be written to the device.
    
Return Value:

    HRESULT

--*/
{
    BYTE sevenSegment = 0;
    HRESULT hr;

    if (value >= ARRAYSIZE(g_NumberToMask)) {
        return E_INVALIDARG;
    }


    sevenSegment = g_NumberToMask[value];
    hr = m_pDeviceIoControl->DeviceIoControlSync(
                         IOCTL_OSRUSBFX2_SET_7_SEGMENT_DISPLAY,
                         &sevenSegment,
                         sizeof(BYTE),
                         NULL,
                         0,
                         NULL
                         );

    return hr;
}

解説

DeviceIoControlAsync メソッドを使用して、IOCTL を非同期的に送信することもできます。 その場合は、IDeviceRequestCompletionCallback インターフェイスを実装する必要があります。

カスタム ドライバー アクセス のサンプル内部デバイス用の UWP デバイス アプリ、ハードウェア デベロッパー センター