Мои программные патчи DLL не обновляются на Windows 10

380
sams

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

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

-1
«Я пытаюсь обновить, отправив несколько исправлений», какие исправления, пожалуйста, объясните. Moab 5 лет назад 0
Как вы продвигаете эти обновления точно? Ramhound 5 лет назад 0
патчи моего программного обеспечения - куча .exes push на клиента sams 5 лет назад 0

2 ответа на вопрос

2
DavidPostill

Как заменить используемую 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

Это не работает для зарегистрированных DLL. harrymc 5 лет назад 0
@harrymc Затем пользователь должен обновить свой вопрос, в котором не упоминаются зарегистрированные библиотеки DLL. DavidPostill 5 лет назад 0
Это в комментариях, но я сделал это сейчас для него. harrymc 5 лет назад 0
1
harrymc

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

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

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

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

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

Harrymc мы говорим о зарегистрированных DLL sams 5 лет назад 0
@sams Вы не упомянули, что эти библиотеки были зарегистрированы. Они применимы только к COM-библиотекам. Ramhound 5 лет назад 0
@sams: я добавил часть для зарегистрированных DLL. harrymc 5 лет назад 0

Похожие вопросы