WIX: отмена регистрации COM при удалении одной из двух программ - PullRequest
5 голосов
/ 22 марта 2010

Я относительно новичок в WiX. Это отличный инструмент, но мне все еще нужно время чтобы узнать это лучше. Я столкнулся с проблемой при регистрации и отмене регистрации COM составная часть. Я создал установщики для двух приложений, давайте назовем их A и B. Оба используют один и тот же компонент COM. Я использовал тепловой инструмент, как рекомендуемые. При установке A или B компонент регистрируется без каких-либо проблемы.

Но когда я устанавливаю A и B, затем удаляю A (с установкой / удалением программ) COM класс становится незарегистрированным, и B больше не может его использовать. Есть ли чистый решение, чтобы предотвратить это? Я хотел бы отменить регистрацию COM когда ОБА А и В удалены.

Любая помощь будет оценена,

С уважением, madbadger

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы. Я установил одинаковое значение GUID в обоих установщиках, и теперь ключи реестра удаляются должным образом, то есть когда последняя программа удаляется из системы.
Однако проблема сохраняется по одной причине. Я проверил реестр в HKEY_CLASSES_ROOT / CLSID / [соответствующий COM GUID]. Вот что происходит:
- Я устанавливаю A, и путь к COM устанавливается на [путь к A / component.dll]
- Я устанавливаю B, и путь к COM устанавливается на [путь к B / component.dll]
- Я удаляю B, и путь к COM остается [путь к B / component.dll]
- Теперь A не может получить доступ к COM-компоненту во время его регистрации, поскольку [путь к B / component.dll] больше не существует

Теперь я предполагаю, что для обоих приложений обязательным является размещение COM-компонента в одном каталоге. Установщик Windows не может вернуться к старому пути, или мне чего-то не хватает?

Ответы [ 3 ]

4 голосов
/ 22 марта 2010

Установщик Windows сделает это за вас, но только если ваш COM-компонент имеет одинаковый GUID для A и B, (и библиотеки DLL установлены в одном и том же месте обоими приложениями).

Установщик Windows работает путем подсчета ссылок каждого компонента (по всей системе).Компоненты идентифицируются по их GUID.

Если COM-компонент имеет тот же GUID, то происходит следующее:

  • Установка A: Пересчет компонента идет от 0-> 1, установщик Windowsрегистрирует его
  • Установка B: Пересчет компонента идет от 1-> 2, ничего не происходит
  • Удаление A: Пересчет компонента идет от 2-> 1, ничего не происходит
  • Удаление B: Компонент refcount идет от 1-> 0, установщик Windows отменяет его регистрацию

Если у него нет того же GUID, что происходит, это

  • Установка A: КомпонентПересчет отсчета идет от 0-> 1, установщик Windows регистрирует его
  • Установка B: Пересчет компонента B идет от 0-> 1, установщик Windows регистрирует его, перезаписывая записи реестра из компонента A.
  • Деинсталляция A: Компонент A счет исходит от 1-> 0, установщик Windows отменяет его регистрацию, удаляя записи реестра.
    - Похоже, что вы находитесь в этой ситуации
  • Деинсталляция B: Компонент BПересчет идетИсходя из 1-> 0, установщик Windows отменяет регистрацию, удаляя записи реестра (но они уже удалены)

Редактировать Поднято из комментариев:

Как и GUID, у каждого компонента также есть «Key Path».Если компонент содержит один или несколько файлов, вы должны указать, какой файл является «Ключом», используя KeyPath="foo.dll".Если компонент содержит одну или несколько записей реестра, он похож.

При проверке, установлено ли что-то, установщик Windows проверит GUID, прочитает путь к ключу, а затем проверит файл по пути к ключу (этокак он выясняет, что это за версии, помимо всего прочего), поэтому, если 2 компонента имеют одинаковый GUID, они должны также имеют одинаковый путь ключа, который должен разрешить к одному и тому жепоместить в файловую систему, когда продукт установлен.

Это довольно распространенный способ сказать, что оба установщика должны поместить общие файлы в одно и то же место.Что касается того, где их разместить, System32 НЕ является хорошим местом.

Я бы посоветовал где-нибудь в папке с общими файлами (обычно Program Files\Common Files\YourCompanyName).Вы бы ввели это в Wix так: Directory="[CommonFilesFolder]\YourCompanyName"

1 голос
/ 22 марта 2010

Используете ли вы в вашем компоненте один и тот же Guid в каждом инсталляторе?

0 голосов
/ 23 марта 2010

Вы должны обернуть этот общий компонент в модуль слияния и ссылаться на него из обоих ваших приложений.

Это автоматически разрешит пересчет общего dll-файла выполнить свою работу при удалении.

...