Implementera enhetsåtkomstobjektet
Det här avsnittet beskriver hur du instansierar objektet för enhetsåtkomst och använder det för att komma åt en enhet. Den instansierade klassen implementerar IDeviceIoControl- och ICreateDeviceAccessAsync-gränssnitt.
Instruktioner
Steg 1
Om du vill instansiera objektet för enhetsåtkomst måste du först anropa funktionen CreateDeviceAccessInstance. Om CreateDeviceAccessInstance- lyckas kan du anropa metoden Vänta för att vänta tills den asynkrona åtgärden har slutförts. Om Wait lyckas kan du hämta ett IDeviceIoControl- -objekt (eller lämpligt fel) från metoden 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;
}
Steg 2
Det här är ett exempel på ett anrop till metoden 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;
}
Anmärkningar
Du kan också skicka en IOCTL asynkront med hjälp av metoden DeviceIoControlAsync. I så fall måste du implementera gränssnittet IDeviceRequestCompletionCallback.
Relaterade ämnen
anpassad drivrutinsåtkomstexempel, UWP-enhetsappar för interna enheter, Maskinvaruutvecklingscenter