Новые файлы, добавленные в патч, удаляются при удалении, даже если они помечены как постоянные.

Использование InstallShield 2013 в проекте Basic MSI. У нас есть несколько устаревших DLL-библиотек Microsoft COM, которые поставляются в модулях слияния, которые мы включаем в наш MSI. Теперь нам нужно обновить несколько из этих библиотек DLL более новыми с помощью дополнительного патча обновления (MSP). У нас нет новых модулей слияния от Microsoft, поэтому я пытаюсь выяснить, как установить эти новые библиотеки DLL в наше приложение.

Я добавил 2 новых компонента, по одному для каждого файла, и создал новый MSP. Файлы устанавливаются правильно, хотя мне пришлось зарегистрировать их вручную в пользовательском действии, иначе исправление было бы невозможно удалить (т.к. я изменил таблицу классов). Все хорошо - пока. Однако, когда я удаляю патч, эти 2 новых файла удаляются!! В этом проблема. Я бы согласился, если бы их вернули к предыдущей версии, но нет. Они прямо удалены. Я пометил файлы как Постоянные - та же проблема. Я обнулил GUID для этих двух новых файлов - та же проблема. Я бы не возражал, если бы они остались в новой версии, поскольку это файлы MS. Я подозреваю, что они не сохраняются, потому что я помечаю их постоянными только в патче, а не в оригинальном MSI. Правильно?

Here's some MSI log info during the installation of the MSP:

MSI (s) (FC:C4) [16:53:38:949]: File = comctl32.ocx: Final State = Install
MSI (s) (FC:C4) [16:53:38:949]: File = osl.dll1.BD822168_4484_412B_AA08_455F82BE5E0F: Final State = Install
MSI (s) (FC:C4) [16:53:48:371]: SELMGR: Component 'comctl32.ocx' is a new component added to feature 'WDCoreComp'
MSI (s) (FC:C4) [16:53:49:371]: Component: comctl32.ocx; Installed: Absent;   Request: Local;   Action: Local;   Client State: Unknown
MSI (s) (FC:C4) [16:53:53:199]: Baseline: Existing comctl32.ocx version 6.0.81.5 does not match any baseline. Will not be cached.

Here's MSI log info from the uninstall of this MSP:
MSI (s) (FC:B8) [16:57:33:236]: File = comctl32.ocx: Final State = Remove
MSI (s) (FC:B8) [16:57:33:236]: File = osl.dll1.BD822168_4484_412B_AA08_455F82BE5E0F: Final State = Overwrite
MSI (s) (FC:B8) [16:58:01:939]: Executing op: FileRemove(,FileName=C:\Windows\SysWOW64\comctl32.ocx,,ComponentId={100B5DC4-FD2D-4311-9ADE-2B65B814F446})

Я включил туда osl.dll, чтобы указать на обычную процедуру исправления для одной из наших DLL, когда она перезаписывается старой версией, но удаляет comctl32.ocx.

Другие варианты кажутся ОЧЕНЬ нежелательными:

  1. используйте Orca, чтобы взломать новые корзины в старых модулях слияния и пересобрать установщик. Надеюсь, патч распознает, что они новые, и установит их правильно.
  2. сделайте все это вручную в пользовательских действиях: во время установки сохраните копию этих файлов, затем установите новые. Во время удаления восстановить старые версии из наших сохраненных копий
  3. установите файлы во временную папку, скопируйте их в официальную папку MS, затем зарегистрируйте их там. Удаление удалит их только из временной папки, а не из официального местоположения MS.

Номер 3 звучит наименее предосудительно, но все же дурной тон делать все это вручную в пользовательских действиях.


person printf fan    schedule 14.02.2020    source источник


Ответы (1)


Сначала я попробовал № 3, но InstallShit мешал мне на каждом шагу. Я не мог копировать файлы в папку "Common Files...\VBA", как бы я ни пытался. Итак, в итоге я сделал №1, хотя и использовал InstallShield для редактирования модулей слияния. К счастью, мне удалось просто заменить бины и пересохранить модули слияния.

person printf fan    schedule 19.02.2020