Implementieren des Gerätezugriffsobjekts
In diesem Thema wird erläutert, wie Sie das Gerätezugriffsobjekt instanziieren und für den Zugriff auf ein Gerät verwenden. Die instanziierte Klasse implementiert die Schnittstellen IDeviceIoControl und ICreateDeviceAccessAsync .
Anweisungen
Schritt 1
Um das Gerätezugriffsobjekt zu instanziieren, müssen Sie zuerst die CreateDeviceAccessInstance-Funktion aufrufen. Wenn CreateDeviceAccessInstance erfolgreich ist, können Sie die Wait-Methode aufrufen, um auf den Abschluss des asynchronen Vorgangs zu warten. Wenn Wait erfolgreich ist, können Sie ein IDeviceIoControl-Objekt (oder den entsprechenden Fehler) aus der GetResult-Methode abrufen.
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;
}
Schritt 2
Dies ist ein Beispiel für einen Aufruf der DeviceIoControlSync-Methode .
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;
}
Bemerkungen
Sie können eine IOCTL auch asynchron senden, indem Sie die DeviceIoControlAsync-Methode verwenden . In diesem Fall müssen Sie die IDeviceRequestCompletionCallback-Schnittstelle implementieren.
Zugehörige Themen
Beispiel für benutzerdefinierten Treiberzugriff, UWP-Geräte-Apps für interne Geräte, Hardware Dev Center