Implémenter l’objet d’accès de l’appareil

Cette rubrique explique comment instancier l’objet d’accès de l’appareil et l’utiliser pour accéder à un appareil. La classe instanciée implémente les interfaces IDeviceIoControl et ICreateDeviceAccessAsync .

Instructions

Étape 1

Pour instancier l’objet d’accès de l’appareil, vous devez d’abord appeler la fonction CreateDeviceAccessInstance . Si CreateDeviceAccessInstance a abouti, vous pouvez ensuite appeler la méthode Wait pour attendre la fin de l’opération asynchrone. Si l' attente a échoué, vous pouvez récupérer un objet IDeviceIoControl (ou l’erreur appropriée) à partir de la méthode 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;
}

Étape 2

Voici un exemple d’appel à la méthode 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;
}

Notes

Vous pouvez également envoyer un IOCTL de manière asynchrone à l’aide de la méthode DeviceIoControlAsync . Dans ce cas, vous devez implémenter l’interface IDeviceRequestCompletionCallback .

exemple d’accès personnalisé aux pilotes, applications de l’appareil UWP pour les appareils internes, Centre de développement matériel