Реализация объекта доступа к устройству
В этом разделе объясняется, как создать экземпляр объекта доступа к устройству и использовать его для доступа к устройству. Экземпляр класса реализует интерфейсы IDeviceIoControl и ICreateDeviceAccessAsync.
Instructions
Шаг 1
Чтобы создать экземпляр объекта доступа к устройству, необходимо сначала вызвать функцию CreateDeviceAccessInstance. Если createDeviceAccessInstance успешно, можно вызвать метод Wait , чтобы дождаться завершения асинхронной операции. Если ожидание выполнено успешно, можно получить объект IDeviceIoControl (или соответствующую ошибку) из метода 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;
}
Шаг 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;
}
Замечания
Вы также можете асинхронно отправлять IOCTL с помощью метода DeviceIoControlAsync. В этом случае необходимо реализовать интерфейс IDeviceRequestCompletionCallback.
См. также
Пример пользовательского доступа к драйверам, приложения устройств UWP для внутренних устройств Центр разработки оборудования