2010-03-21 2 views
5

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

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

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

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

EDIT: Спасибо за ваши ответы. Я устанавливаю идентификатор GUID в одно и то же значение в обоих установщиках, и теперь ключи реестра удаляются должным образом, то есть когда последняя программа удаляется из системы.
Hovewer, проблема сохраняется по одной причине. Я проверил реестр под 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 не может вернуться к старому пути, или это что-то мне не хватает?

ответ

4

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

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

Если COM компонент имеет один и тот же GUID, что происходит это:

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

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

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

Редактировать Uplifted от комментариев:

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

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

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

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

+0

Должен ли я помещать компонент COM в одно место для обоих установщиков? Является ли папка system32 хорошим местом для нее? – madbadger

+0

Да, вы должны поставить его в том же месте.(Установщик Windows идентифицирует как GUID, так и путь к файлу/реестру). System32 НЕ является хорошим местом. Я бы предложил где-то под общей папкой файлов (обычно 'Program Files \ Common Files \ YourCompanyName'). Вы должны ввести это в Wix следующим образом: 'Directory =" [CommonFilesFolder] \ YourCompanyName "' –

+0

Большое спасибо за это, так хорошо! – madbadger

1

В вашем теге Component вы используете тот же Guid в каждом установщике?

0

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

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