Obtención de un objeto de instancia de función
El minidriver WIA debe identificar el dispositivo de hardware actual y el servicio en el que se ejecuta. Para identificar estos elementos, el minidriver obtiene en tiempo de ejecución el objeto Function Instance del servicio Detección de funciones y lee las propiedades del dispositivo.
Para usar interfaces COM de detección de funciones, el código del minidriver debe incluir el archivo de encabezado principal FunctionDiscovery.h , que está disponible en windows Vista SDK, como se muestra en el ejemplo siguiente.
//
// Web Services Function Discovery main header:
//
#include <FunctionDiscovery.h>
Durante la inicialización, como puede ocurrir en el método IStiUSD::Initialize , el minidriver debe consultar detección de funciones para obtener el objeto de instancia de función adecuado que representa el dispositivo de hardware. Para completar esta consulta, use el procedimiento siguiente (y los ejemplos de código asociados):
Paso 1: Crear el objeto de detección de funciones
//
// Function Discovery object
//
IFunctionDiscovery *pFunctionDiscovery = NULL;
CoCreateInstance(__uuidof(FunctionDiscovery),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IFunctionDiscovery),
(void**)&pFunctionDiscovery);
Paso 2: Crear un objeto de consulta de colección de instancias
IFunctionInstanceCollectionQuery *pfiCollectionQuery = NULL;
pFunctionDiscovery->CreateInstanceCollectionQuery(FCTN_CATEGORY_PNP,
NULL,
FALSE,
NULL,
NULL,
&pfiCollectionQuery);
Paso 3: Agregar una restricción al objeto Query de colección de instancias para especificar el identificador PNPX (su valor se recupera con IStiDeviceControl::GetMyDevicePortName) como restricción de consulta
PROPVARIANT PropVar = {0};
//
// Note that the wszDevicePath value is obtained by the WIA minidriver
// calling IStiDeviceControl::GetMyDevicePortName during IStiUSD::Initialize
//
PropVariantInit(&PropVar);
PropVar.vt = VT_LPWSTR;
PropVar.pwszVal = (LPWSTR)wszDevicePath;
pfiCollectionQuery->AddPropertyConstraint(PKEY_PNPX_ID, &PropVar, QC_EQUALS);
Paso 4: Ejecutar la consulta
IFunctionInstanceCollection *pfiCollection = NULL;
pfiCollectionQuery->Execute(&pfiCollection);
Paso 5: Recuperar el objeto de instancia de función que se devuelve
//
// Function Instance object that represents our device instance
//
IFunctionInstance *pFunctionInstance;
pfiCollection->Item(0, &m_pFunctionInstance);
Para obtener un ejemplo de código que contiene la declaración de una clase de ejemplo (CWSDDevice), vea Ejemplo de código para obtener un objeto de instancia de función.