Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico explica como instanciar o objeto de acesso de dispositivo e usá-lo para acessar um dispositivo. A classe instanciada implementa o IDeviceIoControl e ICreateDeviceAccessAsync interfaces.
Instruções
Passo 1
Para instanciar o objeto de acesso ao dispositivo, você deve primeiro chamar a funçãoCreateDeviceAccessInstance. Se CreateDeviceAccessInstance for bem-sucedido, poderá depois chamar o método Wait para aguardar a conclusão da operação assíncrona. Se Wait for bem-sucedido, poderá obter um objeto IDeviceIoControl (ou o erro apropriado) a partir do 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;
}
2º Passo
Este é um exemplo de uma chamada para o 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;
}
Comentários
Você também pode enviar um IOCTL de forma assíncrona usando o método DeviceIoControlAsync. Nesse caso, você deve implementar o IDeviceRequestCompletionCallback interface.
Tópicos relacionados
Exemplo de Acesso de Driver Personalizado, aplicações UWP para dispositivos internos, Centro de Desenvolvimento de Hardware