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


Пример кода: действия Finish-Install в совместном установщике

Примечание

Функции, описанные в этом разделе, не поддерживаются в универсальных или мобильных пакетах драйверов. См . раздел Использование универсального INF-файла.

В этом примере совместный установщик выполняет следующие операции для поддержки действий завершения установки:

  • Когда совместный установщик получает запрос DIF_NEWDEVICEWIZARD_FINISHINSTALL , он вызывает предоставленную установщиком функцию FinishInstallActionsNeeded , чтобы определить, нужно ли выполнить действия завершения установки. (Код для функции FinishInstallActionsNeeded не показан в этом примере.

    Если Метод FinishInstallActionsNeeded возвращает значение TRUE, соинсталлятор вызывает SetupDiGetDeviceInstallParams для получения параметров установки устройства, а затем вызывает метод SetupDiSetDeviceInstallParams , чтобы задать элемент FlagsExструктуры SP_DEVINSTALL_PARAMS для устройства с флагом DI_FLAGSEX_FINISHINSTALL_ACTION. Установка этого флага приводит к тому, что Windows отправляет запрос DIF_FINISHINSTALL_ACTION всем установщикам классов, совместно установщикам классов и соустановкам устройств, участвующим в установке этого устройства. Этот запрос отправляется после завершения всех операций установки, за исключением действий завершения установки.

  • Когда совместный установщик получает запрос на DIF_FINISHINSTALL_ACTION, соинсталлятор снова вызывает Метод FinishInstallActionsNeeded , чтобы определить, есть ли у него действия по завершению установки, и, если да, выполняет действия завершения установки. Совместный установщик уведомляет пользователя о выполнении действий по завершению установки и ожидает завершения действий по установке, прежде чем вернуться из обработки запроса DIF_FINISHINSTALL_ACTION.

  • Если действия завершения установки выполнены успешно, соустановщик уведомляет пользователя о том, что действия по завершению установки выполнены успешно.

  • Если для выполнения действий по завершению установки требуется перезагрузка системы для завершения установки, совместный установщик вызывает SetupDiGetDeviceInstallParams для получения параметров установки устройства, а затем вызывает Метод SetupDiSetDeviceInstallParams, чтобы задать элемент Flags структуры SP_DEVINSTALL_PARAMS для устройства с флагом DI_NEEDREBOOT. Установщик также уведомляет пользователя о необходимости перезагрузки системы.

  • Если действия завершения установки завершаются сбоем и при следующем перечислении устройства необходимо повторить попытку завершения установки, совместный установщик уведомляет пользователя об этой ситуации.

    Примечание Начиная с Windows 8 действие завершения установки выполняется только один раз. Windows не будет автоматически запускать его снова, особенно при следующем перечислении устройства, так как это не происходит при выполнении действий завершения установки.

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

  • По умолчанию совместный установщик возвращает NO_ERROR в ответ на запрос DIF_FINISHINSTALL_ACTION, если действия по завершению установки были успешными или если действия завершения установки завершилися сбоем, а установщик определяет, что повторная попытка выполнения действий завершения установки не должна выполняться. Совместный установщик возвращает код ошибки Win32 только в том случае, если действия завершения установки завершаются сбоем и при следующем перечислении устройства в контексте администратора необходимо повторить попытку завершения установки.

    Примечание Начиная с Windows 8 действие завершения установки выполняется только один раз. Windows не будет автоматически запускать его снова, особенно при следующем перечислении устройства, так как это не происходит при выполнении действий завершения установки.

В следующем примере кода совместного установщика показана базовая структура кода совместного установщика, реализующего действия завершения установки:

DWORD CALLBACK
SampleCoInstaller(
  IN DI_FUNCTION  InstallFunction,
  IN HDEVINFO  DeviceInfoSet,
  IN PSP_DEVINFO_DATA  DeviceInfoData,
  IN OUT PCOINSTALLER_CONTEXT_DATA  Context
  )
{
  SP_DEVINSTALL_PARAMS DeviceInstallParams;
  DWORD ReturnValue = NO_ERROR; // The default return value

  switch(InstallFunction)
  {
    case DIF_NEWDEVICEWIZARD_FINISHINSTALL:
      //
      // Processing for finish-install wizard pages
      //
      // Processing for finish-install actions
      if (FinishInstallActionsNeeded())
      {
        // Obtain the device install parameters for the device
        // and set the DI_FLAGSEX_FINISHINSTALL_ACTION flag
        DeviceInstallParams.cbSize = sizeof(DeviceInstallParams);
        if (SetupDiGetDeviceInstallParams(DeviceInfoSet, DeviceInfoData, &DeviceInstallParams))
        {
          DeviceInstallParams.FlagsEx |= DI_FLAGSEX_FINISHINSTALL_ACTION;
          SetupDiSetDeviceInstallParams(DeviceInfoSet, DeviceInfoData, &DeviceInstallParams);
        }
      }
      break;

    case DIF_FINISHINSTALL_ACTION:
      if (FinishInstallActionsNeeded())
      {
        //
        // Perform the finish-install actions,
        // notify the user that finish install actions
        // are in progress and wait for
        // the finish-install actions to complete
        //
        // If the finish-install actions succeed, notify the user
        //
        // If the finish install actions require a system restart: 
        // notify the user, call SetupDiGetDeviceInstallParams 
        // to obtain the device install parameters for the device in 
        // DeviceInstallParams, and call SetupDiSetInstallParams to set 
        // the DI_NEEDREBOOT flag in DeviceInstallParams.Flags
        // 
        // If the finish install actions failed, but
        // should be attempted again: clean up,
        // notify the user of the failure, and
        // set ReturnValue to an appropriate Win32 error code
        //
        // If the finish install actions failed and 
        // should not be attempted again: clean up
        // and notify the user of the failure
        //
        // Starting with Windows 8, a finish-install action
        // is only run once. Windows will not automatically
        // run it again, especially not the next time
        // the device is enumerated because that is not when
        // finish-install actions are run.
        //
      }
      break;
  }

  return ReturnValue;
}