WIX: нерегистрация COM при удалении одной из двух программ

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

Но когда я устанавливаю A и B, затем удаляю (с, Добавляют/Удаляют программы), COM-класс становится незарегистрированным, и B не может больше использовать его. Существует ли чистое решение предотвратить это? Я хотел бы не зарегистрировать COM, когда И A и B удаляются.

Любая справка ценилась бы,

С наилучшими пожеланиями, madbadger

Править: Спасибо за Ваши ответы. Я установил GUID на то же значение в обоих установщиках, и теперь ключи реестра удаляются правильно, это - когда последняя программа удалена из системы.
Hovewer, проблема сохраняется по одной причине. Я проверил реестр под HKEY_CLASSES_ROOT/CLSID / [соответствующий GUID COM]. Это - то, что происходит:
- Я устанавливаю A, и путь к COM установлен к [путь к A/component.dll]
- Я устанавливаю B, и путь к COM установлен к [путь к B/component.dll]
- Я удаляю B, и путь к COM остается [путем к B/component.dll]
- Теперь A не может получить доступ к COM-компоненту althrough, он регистрируется, потому что [путь к B/component.dll] больше не существует

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

5
задан madbadger 21 March 2010 в 23:41
поделиться

3 ответа

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

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

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

  • Установить A: Номер ссылки компонента изменяется от 0 до 1, установщик Windows регистрирует его
  • Установить B: Номер ссылки компонента изменяется от 1 до 2 , ничего не происходит
  • Деинсталляция A: Счетчик ссылок компонента изменяется от 2 до 1, ничего не происходит
  • Деинсталляция B: Счетчик ссылок компонента изменяется с 1-> 0, установщик Windows отменяет его регистрацию

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

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

Edit Повышено из комментариев:

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

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

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

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

4
ответ дан 14 December 2019 в 19:09
поделиться

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

1
ответ дан 14 December 2019 в 19:09
поделиться

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

Это автоматически позволит общему счету ссылок DLL выполнять свою работу при удалении.

0
ответ дан 14 December 2019 в 19:09
поделиться
Другие вопросы по тегам:

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