Lesen von WIA-Elementeigenschaften durch eine Anwendung
Wenn eine Anwendung eine Anforderung zum Lesen von WIA-Elementeigenschaften sendet, ruft der WIA-Dienst die IWiaMiniDrv::d rvReadItemProperties-Methode auf .
Die IWiaMiniDrv::d rvReadItemProperties-Methode sollte die folgenden Aufgaben ausführen:
Bestimmen Sie, ob die zu lesenden Eigenschaften Laufzeitupdates benötigen. Um zu bestimmen, welche WIA-Eigenschaften gelesen werden, kann der WIA-Minidriver das PROPSPEC-Array verwenden (definiert in der Microsoft Windows SDK-Dokumentation). Es wird empfohlen, dass der WIA-Minidriver den Elementtyp vor der Verarbeitung des PROPSPEC-Arrays bestimmt. Dadurch wird die Notwendigkeit reduziert, das Array für jeden IWiaMiniDrv::d rvReadItemProperties-Aufruf zu durchlaufen. Wenn Sie keine Laufzeiteigenschaften für die untergeordneten Elemente dieses Geräts haben, werden nur Leseanforderungen der Stammelementeigenschaft verarbeitet.
Aktualisieren Sie den aktuellen Wert, indem Sie die Xxx-DienstfunktionenwiasWriteMultiple oder wiasWriteProp mithilfe der ID der WIA-Eigenschaft aufrufen. Dadurch wird der WIA-Eigenschaftssatz aktualisiert, der im Treiberelement gespeichert ist, und der WIA-Dienst gibt den neuen Wert an die Anwendung zurück.
Wenn der WIA-Minitreiber keine Laufzeitanpassungen an WIA-Eigenschaften in dieser Funktion durchführt, gibt der WIA-Dienst automatisch nur den aktuellen WIA-Eigenschaftswert an die Anwendung zurück. Diese Funktion sollte nur für Eigenschaften wie Geräteuhren oder WIA-Eigenschaften verwendet werden, für die hardwarespezifische Überprüfungen erforderlich sind, z. B. Dokumentzuführung status.
Implementieren von IWiaMiniDrv::d rvReadItemProperties
Die IWiaMiniDrv::d rvReadItemProperties-Methode wird aufgerufen, wenn eine Anwendung versucht, die Eigenschaften eines WIA-Elements zu lesen. Der WIA-Dienst benachrichtigt zuerst den Treiber, indem er diese Methode aufruft. Der WIA-Treiber sollte überprüfen, ob die zu lesende Eigenschaft richtig ist. Dies ist ein guter Ort, um auf die Hardware für Eigenschaften zuzugreifen, die status des Geräts erfordern (z. B. WIA_DPS_DOCUMENT_HANDLING_STATUS oder WIA_DPA_DEVICE_TIME, wenn Ihr Gerät eine Uhr unterstützt).
Es ist wichtig zu beachten, dass ein WIA-Treiber nur in seltenen Fällen mit der Hardware kommunizieren sollte. WIA-Treiber, die in diesem Aufruf zu stark mit Hardware kommunizieren, erscheinen träge und langsam.
Das folgende Beispiel zeigt eine Implementierung der IWiaMiniDrv::d rvReadItemProperties-Methode :
HRESULT _stdcall CWIADevice::drvReadItemProperties(
BYTE *pWiasContext,
LONG lFlags,
ULONG nPropSpec,
const PROPSPEC *pPropSpec,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if (!pWiasContext) {
return E_INVALIDARG;
}
if (!plDevErrVal) {
return E_INVALIDARG;
}
if (!pPropSpec) {
return E_INVALIDARG;
}
*plDevErrVal = 0;
LONG lWIAItemType = 0;
HRESULT hr = wiasGetItemType(pWiasContext,&lWIAItemType);
if(S_OK == hr) {
//
// perform custom operations depending on the type of
// WIA item that was passed to drvReadItemProperties
//
if(lWIAItemType & WiaItemTypeRoot) {
//
// If the WIA_DPA_CONNECT_STATUS property ID is in the PROPSPEC
// array, then read the latest "Connect Status".
// If it is NOT then do nothing. (skip access to the hardware)
//
// NOTE: only read properties contained in the PROPSPEC array
// from the hardware that need device updates.
// If the property in PROPSPEC does not need to be read
// from the hardware, or updated, do nothing. The WIA service
// will supply the caller with the current value in the
// the WIA property set.
//
BOOL bReadLatestConnectStatus = FALSE;
//
// traverse the WIA PROPSPEC array, looking for known WIA
// properties that require run-time updates, or needs to be
// updated with hardware access.
//
for(ULONG ulIndex = 0; ulIndex < nPropSpec; ulIndex++) {
//
// look for WIA property IDs that really need hardware
// access, or run-time adjusting.
//
if(pPropSpec[ulIndex].propid == WIA_DPA_CONNECT_STATUS) {
bReadLatestConnectStatus = TRUE;
}
}
//
// The item passed in is a ROOT item
//
if(bReadLatestConnectStatus) {
//
// WIA_DPA_CONNECT_STATUS should be updated from the
// hardware
//
LONG lConnectStatus = HARDWARE_READ_ConnectStatus();
//
// update WIA_DPA_CONNECT_STATUS property value using
// wiasWritePropLong (). The pWiasContext passed in
// already represents the current item to be written to.
//
hr = wiasWritePropLong(pWiasContext,WIA_DPA_CONNECT_STATUS,lConnectStatus);
if(S_OK == hr) {
//
// The WIA_DPA_CONNECT_STATUS property was successfully updated
//
} else {
//
// wiasWritePropLong() failed to write the WIA
// property. The WIA_DPA_CONNECT_STATUS
// property was NOT updated
//
}
}
} else {
//
// The item passed in is any other child item
//
}
} else {
//
// wiasGetItemType() failed to get the current item type
//
}
return hr;
}