Поделиться через


Получение объекта экземпляра функции

Мини-накопитель 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), см. в разделе Пример кода для получения объекта экземпляра функции.