-1

У меня есть файлы в Windows 10 (DLL, EXE, MSI), которые я пытаюсь обновить, отправив некоторые исправления. Но проблема заключается в обновлении, если какой-либо файл используется, и я пытаюсь обновить этот файл, заменив его новым обновленным файлом, Windows запрашивает всплывающее окно удаления файла для существующего файла.Если мы говорим «да», он отображается как успешно удаленный, но не удаляется, пока последний пользователь не выпустит файл.После этого новый обновленный файл не заменяется в этом месте.

Изменить: постер указал в комментарии, что его проблема связана с зарегистрированными DLL.

2 ответа2

2

Как заменить используемую DLL?

Обновления библиотеки динамических ссылок

Иногда необходимо заменить DLL на более новую версию. Перед заменой DLL выполните проверку версии, чтобы убедиться, что вы заменяете более старую версию более новой. Можно заменить используемую DLL. Метод, используемый для замены используемых библиотек DLL, зависит от используемой операционной системы. В Windows XP и более поздних версиях приложения должны использовать изолированные приложения и параллельные сборки.

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

  • Используйте функцию MoveFileEx чтобы переименовать заменяемую DLL. Не указывайте MOVEFILE_COPY_ALLOWED и убедитесь, что переименованный файл находится на том же томе, что и исходный файл. Вы также можете просто переименовать файл в том же каталоге, задав ему другое расширение.
  • Скопируйте новую DLL в каталог, который содержит переименованную DLL. Все приложения теперь будут использовать новую DLL.
  • Используйте MoveFileEx с MOVEFILE_DELAY_UNTIL_REBOOT чтобы удалить переименованную DLL.

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

Обновления исходной библиотеки Dynamic-Link (Windows)


Как заменить используемые файлы при перезагрузке Windows

В этой статье описывается другой метод, который вы можете использовать для замены файлов, используемых Windows. Этот метод использует реестр для замены файла при запуске, прежде чем файл будет доступен для Windows.

Следующие шаги демонстрируют, как заменить файл Win32k.sys в %SystemRoot%\System32 файлом Win32k.sys, расположенным в папке C: \Temp. Вы можете использовать варианты этого метода для замены любого файла, если ваша установка Windows является загрузочной.

  1. Запустите редактор реестра (Regedt32.exe).
  2. Найдите следующий ключ в реестре Windows:
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
  3. Создайте новое значение, используя следующую информацию:
    • Имя значения: PendingFileRenameOperations
    • Тип данных: REG_MULTI_SZ
    • Значение данных: \??\c: \temp \win32k.sys!\??\C: \ WINNT \ system32 \win32k.sys
    • Обратите внимание, что данные значения вводятся в две отдельные строки.
  4. Закройте редактор реестра.
  5. Перезагрузите компьютер.

Источник Как заменить используемые файлы при перезагрузке Windows

1

Правильный способ заменить DLL:

  • Переименовать файл DLL
  • Сохраните новый файл DLL под правильным именем
  • Переименованный файл становится удаляемым, когда он больше не используется.

Для зарегистрированных библиотек DLL вы должны отменить их регистрацию на месте и зарегистрировать новую версию. Процесс отмены регистрации (если он выполняется с помощью установщика) обнаружит используемые библиотеки DLL и предупредит вас о необходимости перезагрузки. Кроме того, это также означает, что библиотеки DLL не могут быть загружены (однажды незарегистрированными), пока вы копируете новые файлы или регистрируете новые файлы.

Поэтому вы должны распространять свой патч в качестве установщика. Например, вы можете использовать бесплатную настройку Inno. Когда я использовал его в последний раз, вам нужно было установить атрибуты библиотек DLL, которые будут установлены, чтобы выполнить регистрацию и перерегистрацию. Тогда процесс будет автоматическим, и на вашей стороне не требуется никакого специального программирования.

Если вы не можете распространять свой патч в качестве установщика, вы должны установить его как однократный при запуске и потребовать перезагрузки. Для получения дополнительной информации см. Статью « Запуск программы только один раз при загрузке в Windows», которая требует некоторой работы с реестром.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .