Lecture des propriétés d’élément WIA par une application
Lorsqu’une application effectue une demande de lecture des propriétés d’élément WIA, le service WIA appelle la méthode IWiaMiniDrv::d rvReadItemProperties .
La méthode IWiaMiniDrv::d rvReadItemProperties doit effectuer les tâches suivantes :
Déterminez si les propriétés en cours de lecture ont besoin de mises à jour au moment de l’exécution. Pour déterminer les propriétés WIA en cours de lecture, le minidriver WIA peut utiliser le tableau PROPSPEC (défini dans la documentation Microsoft Windows SDK). Il est recommandé que le minidriver WIA détermine le type d’élément avant de traiter le tableau PROPSPEC. Cela réduit la nécessité de parcourir le tableau sur chaque appel IWiaMiniDrv::d rvReadItemProperties . Si vous n’avez aucune propriété d’exécution sur les éléments enfants de cet appareil, seules les demandes de lecture de propriété d’élément racine seront traitées.
Mettez à jour la valeur actuelle en appelant les fonctions de service wiasWriteMultiple ou wiasWritePropXxx , à l’aide de l’ID de la propriété WIA. Cela met à jour le jeu de propriétés WIA stocké dans l’élément de pilote, et le service WIA retourne la nouvelle valeur à l’application.
Si le minidriver WIA n’effectue aucun ajustement au moment de l’exécution des propriétés WIA dans cette fonction, le service WIA retourne automatiquement uniquement la valeur de la propriété WIA actuelle à l’application. Cette fonction doit être utilisée uniquement pour les propriétés telles que les horloges des appareils ou les propriétés WIA qui nécessitent des vérifications spécifiques au matériel, telles que le chargeur de documents status.
Implémentation d’IWiaMiniDrv::d rvReadItemProperties
La méthode IWiaMiniDrv::d rvReadItemProperties est appelée lorsqu’une application tente de lire les propriétés d’un élément WIA. Le service WIA avertit d’abord le pilote en appelant cette méthode. Le pilote WIA doit vérifier que la propriété en cours de lecture est correcte. Il s’agit d’un bon endroit pour accéder au matériel pour les propriétés qui nécessitent une status d’appareil (par exemple, WIA_DPS_DOCUMENT_HANDLING_STATUS ou WIA_DPA_DEVICE_TIME si votre appareil prend en charge une horloge).
Il est important de noter qu’un pilote WIA ne doit communiquer avec le matériel que dans de rares occasions. Les pilotes WIA qui communiquent trop avec le matériel dans cet appel apparaîtront lents et lents.
L’exemple suivant montre une implémentation de la méthode IWiaMiniDrv::d rvReadItemProperties :
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;
}