Получение объекта экземпляра функции
Мини-накопитель WIA должен идентифицировать текущее аппаратное устройство и службу, на котором оно работает. Чтобы определить эти элементы, мини-driver получает во время выполнения объект экземпляра функции из службы обнаружения функций и считывает свойства устройства.
Чтобы использовать COM-интерфейсы обнаружения функций, код мини-драйвера должен включать файл заголовка FunctionDiscovery.h main, который доступен в пакете SDK для Windows Vista, как показано в следующем примере.
//
// Web Services Function Discovery main header:
//
#include <FunctionDiscovery.h>
Во время инициализации, как это может произойти в методе IStiUSD::Initialize , мини-driver должен запросить обнаружение функций, чтобы получить соответствующий объект экземпляра функции, представляющий аппаратное устройство. Чтобы выполнить этот запрос, используйте следующую процедуру (и связанные примеры кода):
Шаг 1. Создание объекта обнаружения функций
//
// Function Discovery object
//
IFunctionDiscovery *pFunctionDiscovery = NULL;
CoCreateInstance(__uuidof(FunctionDiscovery),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IFunctionDiscovery),
(void**)&pFunctionDiscovery);
Шаг 2. Создание объекта запроса коллекции экземпляров
IFunctionInstanceCollectionQuery *pfiCollectionQuery = NULL;
pFunctionDiscovery->CreateInstanceCollectionQuery(FCTN_CATEGORY_PNP,
NULL,
FALSE,
NULL,
NULL,
&pfiCollectionQuery);
Шаг 3. Добавьте ограничение в объект запроса коллекции экземпляров, чтобы указать идентификатор PNPX (его значение извлекается с помощью IStiDeviceControl::GetMyDevicePortName) в качестве ограничения запроса.
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);
Шаг 4. Выполнение запроса
IFunctionInstanceCollection *pfiCollection = NULL;
pfiCollectionQuery->Execute(&pfiCollection);
Шаг 5. Получение возвращаемого объекта экземпляра функции
//
// Function Instance object that represents our device instance
//
IFunctionInstance *pFunctionInstance;
pfiCollection->Item(0, &m_pFunctionInstance);
Пример кода, содержащий объявление примера класса (CWSDDevice), см. в разделе Пример кода для получения объекта экземпляра функции.