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


Функция SetupDiRegisterDeviceInfo (setupapi.h)

Функция SetupDiRegisterDeviceInfo является обработчиком по умолчанию для запроса DIF_REGISTERDEVICE .

Синтаксис

WINSETUPAPI BOOL SetupDiRegisterDeviceInfo(
  [in]            HDEVINFO           DeviceInfoSet,
  [in, out]       PSP_DEVINFO_DATA   DeviceInfoData,
  [in]            DWORD              Flags,
  [in, optional]  PSP_DETSIG_CMPPROC CompareProc,
  [in, optional]  PVOID              CompareContext,
  [out, optional] PSP_DEVINFO_DATA   DupDeviceInfoData
);

Параметры

[in] DeviceInfoSet

Дескриптор набора сведений об устройстве , содержащего элемент сведений об устройстве, представляющий регистрируемое устройство. Набор сведений об устройстве не должен содержать удаленных элементов.

[in, out] DeviceInfoData

Указатель на структуру SP_DEVINFO_DATA , указывающую элемент сведений об устройстве в DeviceInfoSet. Это параметр IN-OUT, так как DeviceInfoData.При возврате devInst может быть обновлено новое значение дескриптора.

[in] Flags

Значение флага, определяющее способ регистрации устройства, которое может быть равно нулю или следующему значению:

SPRDI_FIND_DUPS

Найдите ранее существующий экземпляр устройства , соответствующий устройству, представленному DeviceInfoData. Если этот флаг не указан, экземпляр устройства регистрируется независимо от того, существует ли для него экземпляр устройства.

Если вызывающий объект предоставляет CompareProc, вызывающий объект также должен установить этот флаг.

[in, optional] CompareProc

Указатель на функцию обратного вызова сравнения, используемую при обнаружении дубликатов. Этот параметр является необязательным и может иметь значение NULL. Если указан этот параметр, функция обратного вызова вызывается для каждого экземпляра устройства, который имеет тот же класс, что и регистрируемого экземпляра устройства. Прототип функции обратного вызова выглядит следующим образом:

typedef  DWORD (CALLBACK* PSP_DETSIG_CMPPROC) (
    IN HDEVINFO  DeviceInfoSet,
    IN PSP_DEVINFO_DATA  NewDeviceData,
    IN PSP_DEVINFO_DATA  ExistingDeviceData,
    IN PVOID  CompareContextOPTIONAL
    );

Функция сравнения должна возвращать ERROR_DUPLICATE_FOUND, если обнаруживает, что два устройства являются дубликатами. В противном случае он должен вернуть NO_ERROR. При обнаружении другой ошибки функция обратного вызова должна вернуть соответствующий код ERROR_*, указывающий на сбой.

Если параметр CompareProc не указан и запрашивается обнаружение дублирования, используется поведение сравнения по умолчанию. По умолчанию выполняется сравнение сигнатуры обнаружения нового устройства с сигнатурой обнаружения всех других устройств в классе . Сигнатура обнаружения содержится в дескрипторе ресурса класса конфигурации журнала загрузки устройства.

[in, optional] CompareContext

Указатель на буфер контекста, предоставленный вызывающим объектом, который передается в функцию обратного вызова. Если параметр CompareProc не указан, этот параметр игнорируется.

[out, optional] DupDeviceInfoData

Указатель на SP_DEVINFO_DATA структуру для получения сведений об экземпляре повторяющегося устройства, если таковой имеется, обнаруженном в результате попытки регистрации этого устройства. Этот параметр является необязательным и может иметь значение NULL. Если этот параметр указан, вызывающий объект должен задать DupDeviceInfoData.cbSize to sizeof(SP_DEVINFO_DATA). Это значение будет заполнено, если функция возвращает значение FALSE, а GetLastError возвращает ERROR_DUPLICATE_FOUND. Этот элемент сведений об устройстве добавляется как член указанного DeviceInfoSet, если он еще не является элементом. Если параметр DupDeviceInfoData не указан, дубликат не добавляется в набор сведений об устройстве.

При вызове этой функции при обработке запроса DIF_REGISTERDEVICE параметр DupDeviceInfoData должен иметь значение NULL.

Возвращаемое значение

Функция возвращает значение TRUE в случае успешного выполнения. В противном случае возвращается значение FALSE , а зарегистрированная ошибка может быть получена с помощью вызова Метода GetLastError.

Комментарии

SetupDiRegisterDeviceInfo в основном предназначен для регистрации устройства, отличного от PnP, в диспетчере Plug and Play (PnP) на локальном компьютере. Хотя SetupDiRegisterDeviceInfo не завершится ошибкой, если набор сведений об устройстве предназначен для удаленного компьютера, этот результат используется ограниченно, так как набор сведений об устройстве впоследствии не может использоваться с запросами на установку DIF_Xxx или функциями SetupDiXxx , которые не поддерживают операции на удаленном компьютере. Например, вызов SetupDiCreateDevRegKey для выполнения раздела INF для нового зарегистрированного устройства на удаленном компьютере завершится ошибкой.

Примечание Только установщик класса должен вызывать SetupDiRegisterDeviceInfo и только в тех ситуациях, когда установщик класса должен выполнять операции регистрации устройств после завершения операции регистрации устройства по умолчанию. В таких ситуациях установщик класса должен напрямую вызывать SetupDiRegisterDeviceInfo , когда установщик обрабатывает запрос DIF_REGISTERDEVICE. Дополнительные сведения о вызове обработчика по умолчанию см. в разделе Вызов обработчиков кода DIF по умолчанию.
 
После регистрации элемента сведений об устройстве вызывающий объект должен обновить все сохраненные копии дескриптора DevInst , связанного с этим устройством. Это необходимо, так как значение дескриптора могло измениться во время регистрации. Вызывающему объекту не нужно снова извлекать структуру SP_DEVINFO_DATA, так как поле DevInst структуры обновляется с учетом текущего значения дескриптора.

Не вызывайте эту функцию напрямую для экземпляров устройств PnP. Экземпляры устройств PnP автоматически регистрируются операционной системой. Однако необходимо зарегистрировать экземпляры устройств, отличных от PnP, одним из следующих способов:

  1. Если приложение установки использует запрос DIF_DETECT для успешного обнаружения устройства, оно также должно использовать запрос DIF_REGISTERDEVICE для регистрации экземпляра устройства. Запрос должен обрабатываться по умолчанию. (По умолчанию SetupDiCallClassInstaller сначала вызывает установщик класса и со-установщики класса для обнаружения дубликатов и регистрации экземпляра устройства. Если эти установщики не регистрируют экземпляр устройства, SetupDiCallClassInstaller вызывает SetupDiRegisterDeviceInfo для обнаружения дубликатов и регистрации экземпляра устройства.)
  2. Если приложение установки создает экземпляр устройства (например, путем вызова SetupDiCreateDeviceInfo), но не выполняет обнаружение дубликатов, приложение установки должно использовать запрос DIF_REGISTERDEVICE для регистрации экземпляра устройства. Запрос должен обрабатываться по умолчанию, как описано выше.
  3. Если приложение установки создает новое устройство и выполняет обнаружение дубликатов, приложение установки должно использовать запрос DIF_REGISTERDEVICE, но не позволить SetupDiCallClassInstaller вызывать SetupDiRegisterDeviceInfo. Чтобы запретить setupDiCallClassInstaller вызывать SetupDiRegisterDeviceInfo, установите флаг DI_NODI_DEFAULTACTION в элементе Flags структуры SP_DEVINSTALL_PARAMS для экземпляра устройства.

    Если SetupDiCallClassInstaller возвращает значение TRUE для запроса DIF_REGISTERDEVICE, установщик класса или совместное установщики класса зарегистрировали экземпляр устройства. В этом случае приложение установки может продолжить установку устройства.

    Если SetupDiCallClassInstaller возвращает значение FALSE для запроса DIF_REGISTERDEVICE, установщик класса или совместное установщики класса не зарегистрировали экземпляр устройства. В этом случае приложение установки должно выполнить одно из следующих действий в зависимости от последней ошибки, возвращаемой Командой GetLastError для запроса:

    • Если последняя ошибка ERROR_DI_DO_DEFAULT, приложение установки может напрямую вызвать SetupDiRegisterDeviceInfo и предоставить CompareProc для обнаружения дубликатов. Если этот вызов выполнен успешно и дубликаты не найдены, установка устройства может быть продолжена. При обнаружении дубликата SetupDiRegisterDeviceInfo возвращает значение FALSE, и приложение установки должно завершить установку устройства.
    • Если последняя ошибка не ERROR_DI_DO_DEFAULT, приложение установки должно завершить установку устройства.
    Вызывающий объект SetupDiRegisterDeviceInfo должен быть членом группы Администраторы.

Требования

Требование Значение
Минимальная версия клиента Доступно в Microsoft Windows 2000 и более поздних версиях Windows.
Целевая платформа Персональный компьютер
Верхняя часть setupapi.h (включая Setupapi.h)
Библиотека Setupapi.lib
DLL Setupapi.dll

См. также раздел

DIF_REGISTERDEVICE

SP_DEVINFO_DATA

SP_DEVINSTALL_PARAMS