Создание MSP-патчей из MSI CAB-файлов: Полное руководство
Узнайте, как создавать MSP-патчи из MSI-файлов с встроенными CAB-файлами. Исправьте ошибку 0xC00E5116 с помощью нашего полного руководства, охватывающего административные установки, альтернативные методы и лучшие практики для успешного создания патчей.
Как создать MSP-патчи из MSI-файлов с файлами, встроенными в CAB, с помощью msimsp?
Я пытаюсь создать MSP-файл из двух MSI-файлов, созданных с помощью Advanced Installer. Я выбрал опцию “Архивировать установочные файлы в CAB-файлы”, но не выбрал “Сжимать CAB-файлы для уменьшения размера”.
Когда я запускаю:
msimsp -s MyProperties.pcp -p MyPatch.msp -l MyPatch.log
я получаю код ошибки 0xC00E5116. В логе показано:
ERROR: UpgradedImages.MsiPath 'C:\MyFolder\Setup.msi' помечен как содержащий сжатые файлы (свойство PID_WORDCOUNT потока Summary Information). PatchWiz не может патчить файлы, сжатые в cabinet.
Однако я не выбирал сжатие файлов. Является ли помещение в cabinet “сжатием” с точки зрения msimsp, или есть способ обойти эту проблему?
Это работает нормально, если я выбираю “Размещать файлы распакованными в папках рядом с базой данных MSI”, но я предпочитаю распространять установщик в виде одного MSI- (или EXE-) файла. Возможно ли это, сохранив возможность создания патча?
Ошибка 0xC00E5116 возникает из-за того, что msimsp (инструмент создания патчей Microsoft) рассматривает любой MSI-файл с файлами, встроенными в cabinet (CAB) файлы, как “сжатый”, независимо от того, сжаты ли сами CAB-файлы. Это происходит потому, что свойство PID_WORDCOUNT в потоке сводной информации MSI указывает, что файлы содержатся внутри cabinet-файлов, которые msimsp не может патчить напрямую. Эту проблему можно решить, создав административные установки или используя альтернативные методы создания патчей, которые работают с файлами, встроенными в CAB.
Содержание
- Понимание ошибки 0xC00E5116
- Почему файлы в CAB-файлах считаются “сжатыми”
- Решение 1: Использование административных установок
- Решение 2: Создание несжатых MSI-файлов
- Решение 3: Альтернативные методы создания патчей
- Расширенная конфигурация Advanced Installer
- Устранение неполадок и лучшие практики
Понимание ошибки 0xC00E5116
Код ошибки 0xC00E5116 соответствует ERROR_PCW_UPGRADED_IMAGE_COMPRESSED в Windows SDK. Эта ошибка возникает при попытке создания патча с помощью msimsp для MSI-файлов, в которых файлы встроены в cabinet (CAB) файлы.
Согласно результатам исследований, сообщение об ошибке гласит:
ERROR: UpgradedImages.MsiPath 'C:\MyFolder\Setup.msi' помечен как имеющий сжатые файлы (свойство PID_WORDCOUNT потока сводной информации). PatchWiz не может патчить файлы, сжатые в cabinet-файле.
Это происходит потому, что базовый компонент msimsp, PatchWiz, может работать только с несжатыми образами. Инструмент проверяет свойство PID_WORDCOUNT в потоке сводной информации MSI, которое указывает, встроены ли файлы в cabinet-файлы или хранятся отдельно.
Ключевое замечание: Даже если вы не выбрали “Сжать CAB-файлы для уменьшения размера” в Advanced Installer, простое помещение файлов в CAB-файлы (без сжатия) все равно заставляет msimsp рассматривать MSI как сжатый.
Почему файлы в CAB-файлах считаются “сжатыми”
Путаница возникает из-за терминологии, используемой в технологии Windows Installer:
-
CAB-файлы против сжатия: Когда вы выбираете “Архивировать установочные файлы в CAB-файлы” в Advanced Installer, вы встраиваете файлы в контейнеры cabinet, но это не обязательно означает, что они сжаты.
-
Свойство PID_WORDCOUNT: Это свойство в потоке сводной информации MSI указывает, встроены ли файлы в cabinet-файлы. Когда файлы находятся в cabinet-файлах, это свойство показывает, что пакет “сжат” с точки зрения msimsp, даже если сами CAB-файлы не сжаты.
-
Ограничение PatchWiz: Движок создания патчей, PatchWiz, не может напрямую патчить файлы, хранящиеся в cabinet-файлах внутри MSI-файлов. Это фундаментальное ограничение процесса создания патчей.
Как указано в документации Microsoft, для указания исходного образа, который имеет как cabinet-файл, так и несжатые файлы, вам нужно пометить пакет как несжатый, сбросив бит 1 в свойстве сводной информации WordCount.
Решение 1: Использование административных установок
Наиболее надежным решением является использование административных установок, которые извлекают файлы за пределами cabinet-файлов:
Пошаговый процесс:
-
Создание административных установок:
cmdmsiexec /a "C:\Original\Setup.msi" /t "C:\Admin\Original" msiexec /a "C:\Updated\Setup.msi" /t "C:\Admin\Updated"
-
Создание PCP-файла: Укажите в вашем PCP-файле на эти административные установки вместо исходных MSI-файлов.
-
Запуск msimsp:
cmdmsimsp -s MyProperties.pcp -p MyPatch.msp -l MyPatch.log
Преимущества:
- Файлы несжаты и доступны для патчинга
- Поддерживает единое распространение MSI
- Сохраняет всю исходную функциональность
Недостатки:
- Требует дополнительного шага создания административной установки
- Изначально большие файлы распространения
Как сообщил один пользователь на форумах MSDN, он наконец решил проблему, указав целевые и обновленные образы на административную установку вместо исходных MSI-файлов.
Решение 2: Создание несжатых MSI-файлов
Если вы предпочитаете избегать административных установок, вы можете создавать MSI-файлы с несжатыми файлами:
В Advanced Installer:
-
Отключение архивации CAB:
- Перейдите в раздел “Файлы и папки”
- Снимите флажок “Архивировать установочные файлы в CAB-файлы”
- Установите флажок “Размещать файлы распакованными в папках рядом с базой данных MSI”
-
Сборка MSI: Создайте ваш MSI с этой конфигурацией
-
Создание патча: Используйте msimsp с несжатыми MSI-файлами
Для существующих MSI-файлов:
Если у вас есть существующие MSI-файлы с CAB-файлами, вы можете попытаться удалить сжатие:
msiexec /a "Setup.msi" /t "Admin" msidb -d "Admin\Setup.msi" -r
Однако, как отмечено в обсуждениях Stack Overflow, этот подход может привести к исчезновению файлов и может быть ненадежным.
Решение 3: Альтернативные методы создания патчей
Вариант А: Использование встроенных функций патчинга Advanced Installer
Вместо прямого использования msimsp используйте функции создания патчей в Advanced Installer:
- Откройте Advanced Installer
- Создайте новый проект: Выберите опцию “Создать новый патч”
- Выберите базовый и целевой MSI: Выберите ваши исходный и обновленный MSI-файлы
- Настройте параметры патча: Установите соответствующие свойства патча
- Соберите патч: Позвольте Advanced Installer обработать создание патча внутренне
Вариант Б: Использование WiX Toolset
Если вы используете WiX, вы можете создавать патчи с помощью инструмента heat и light:
heat dir "OriginalFiles" -out Original.wxs -ag -srd -sreg -sfrag
heat dir "UpdatedFiles" -out Updated.wxs -ag -srd -sreg -sfrag
candle Original.wxs Updated.wxs
light Original.wixobj Updated.wixobj -out Patch.wixmsp
Вариант В: Сторонние инструменты
Рассмотрите возможность использования специализированных инструментов создания патчей, которые лучше обрабатывают файлы, встроенные в CAB, чем msimsp.
Расширенная конфигурация Advanced Installer
Для правильной настройки Advanced Installer для создания патчей:
-
Параметры проекта:
- Перейдите в “Свойства проекта” → “Установка”
- Убедитесь в согласованности кодов продуктов и версий между базовой и целевой версиями
-
Создание патча:
- Используйте меню “Сборка” → “Создать патч”
- Выберите подходящий тип патча (основное обновление, минорное обновление и т.д.)
-
Обработка файлов:
- Для CAB-файлов учтите компромисс между размером распространения и возможностью патчинга
- Тщательно тестируйте патчи в различных сценариях установки
Как отмечено на форумах Advanced Installer, некоторые проблемы можно решить, восстановив установку Windows SDK или проверив наличие отсутствующих зависимостей.
Устранение неполадок и лучшие практики
Распространенные проблемы:
-
Сообщения об ошибках: Обращайте внимание на конкретные коды ошибок и сообщения в файле журнала
-
Пути к файлам: Убедитесь, что в путях к файлам нет пробелов или специальных символов
-
Разрешения: Запускайте msimsp с соответствующими административными привилегиями
Лучшие практики:
- Тщательное тестирование: Всегда тестируйте патчи на чистых установках
- Ведение журналов: Поддерживайте подробные журналы для устранения неполадок
- Контроль версий: Используйте управление версиями для файлов патчей
- Документация: Документируйте процессы создания патчей и принятые решения
Как предложено в документации Microsoft, при работе со сжатыми и несжатыми файлами помечайте пакет как несжатый в свойстве WordCount и устанавливайте соответствующие атрибуты в таблице File.
Заключение
Создание MSP-патчей из MSI-файлов с файлами, встроенными в CAB, требует понимания ограничений msimsp и реализации соответствующих обходных решений. Ключевые выводы:
- Ошибка 0xC00E5116 указывает, что msimsp не может патчить MSI-файлы с файлами, встроенными в cabinet-файлы, даже если эти cabinet-файлы не сжаты
- Административные установки предоставляют наиболее надежное решение для патчинга файлов, встроенных в CAB
- Альтернативные инструменты, такие как встроенные функции патчинга Advanced Installer или WiX Toolset, могут offer лучшую совместимость
- Существуют компромиссы в конфигурации между размером распространения и возможностью патчинга
Для вашего конкретного случая я рекомендую использовать административные установки как наиболее надежное решение, которое позволяет поддерживать единое распространение MSI при успешном создании патчей. Если вы предпочитаете избегать административных установок, рассмотрите использование встроенных функций создания патчей в Advanced Installer вместо прямого использования msimsp.
Источники
- Microsoft Community - msimsp ошибка и свойство PID_WORDCOUNT
- Google Groups - Не удалось создать патч, код ошибки 0xC00E5116
- Stack Overflow - PatchWiz не может патчить файлы, сжатые в cabinet-файле
- Microsoft Narkive - Ошибка создания патча, код 0xC00E5116
- Документация Microsoft - Свойство WordCount
- Stack Overflow - Создание патчей с файлами, встроенными в CAB
- Форумы Advanced Installer - Сборка патча и msimsp.exe