Использование 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.
Другие варианты кажутся ОЧЕНЬ нежелательными:
- используйте Orca, чтобы взломать новые корзины в старых модулях слияния и пересобрать установщик. Надеюсь, патч распознает, что они новые, и установит их правильно.
- сделайте все это вручную в пользовательских действиях: во время установки сохраните копию этих файлов, затем установите новые. Во время удаления восстановить старые версии из наших сохраненных копий
- установите файлы во временную папку, скопируйте их в официальную папку MS, затем зарегистрируйте их там. Удаление удалит их только из временной папки, а не из официального местоположения MS.
Номер 3 звучит наименее предосудительно, но все же дурной тон делать все это вручную в пользовательских действиях.