Compartir a través de


Implementación del objeto de acceso al dispositivo

En este tema se explica cómo crear una instancia del objeto de acceso al dispositivo y usarlo para acceder a un dispositivo. La clase creada implementa las interfaces IDeviceIoControl e ICreateDeviceAccessAsync .

Instrucciones

Paso 1

Para crear una instancia del objeto de acceso al dispositivo, primero debe llamar a la función CreateDeviceAccessInstance . Si CreateDeviceAccessInstance se realiza correctamente, puede llamar al método Wait para esperar a que finalice la operación asincrónica. Si Wait se realiza correctamente, puede recuperar un objeto IDeviceIoControl (o el error adecuado) del método GetResult .

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

Paso 2

Este es un ejemplo de una llamada al método 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;
}

Observaciones

También puede enviar un IOCTL de forma asincrónica mediante el método DeviceIoControlAsync . En ese caso, debe implementar la interfaz IDeviceRequestCompletionCallback .

Ejemplo de acceso al controlador personalizado, aplicaciones de dispositivos para UWP para dispositivos internos, Centro de desarrollo de hardware