Menerapkan Objek Akses Perangkat

Topik ini menjelaskan cara membuat instans objek akses perangkat dan menggunakannya untuk mengakses perangkat. Kelas yang dibuat mengimplementasikan IDeviceIoControl dan antarmuka ICreateDeviceAccessAsync.

Peraturan

Langkah 1

Untuk membuat instans objek akses perangkat, Anda harus terlebih dahulu memanggil fungsiCreateDeviceAccessInstance. Jika CreateDeviceAccessInstance berhasil, Anda kemudian dapat memanggil metode Tunggu untuk menunggu operasi asinkron selesai. Jika Tunggu berhasil, Anda dapat mengambil objekIDeviceIoControl(atau kesalahan yang sesuai) dari metodeGetResult.

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;
}

Langkah 2

Ini adalah contoh panggilan ke metode 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;
}

Komentar

Anda juga dapat mengirim IOCTL secara asinkron dengan menggunakan metode DeviceIoControlAsync. Dalam hal ini, Anda harus menerapkan antarmuka IDeviceRequestCompletionCallback.

Sampel Akses Driver Kustom , aplikasi perangkat UWP untuk perangkat internal, Pusat Dev Perangkat Keras