Я бы сделал это так.
Конечно ваше приложение сохраняет папку установки в реестре, когда оно установлено. Затем ваш языковой пакет ищет эту запись в реестре.
- Если место установки не сохранено в реестре, значит ваше приложение не установлено: сообщить об ошибке и выйти.
- В противном случае вы знаете, куда копировать языковые файлы, поэтому приступайте к установке языкового пакета.
Ваш языковой пакет будет иметь собственную запись в разделе «Установка и удаление программ».
Если вы не хотите этого, есть два других варианта:
- Зарегистрируйте языковой пакет как обновление для вашего приложения. Тогда он будет отображаться только тогда, когда пользователь выберет просмотр установленных обновлений.
Как это сделать, описано в Фильтрация списка «Установка и удаление программ» .
- Скрыть ваш пакет от установки / удаления программ. В этом случае вы должны предоставить другой способ удаления пакета.
Есть еще одна вещь: деинсталлятор для вашего основного приложения должен (может) предоставлять опции для удаления всех установленных языковых пакетов. Вы не хотите, чтобы пользователи удаляли их вручную, верно?
Это сложно. Самый простой подход, который приходит мне в голову, заключается в том, что ваш основной деинсталлятор перечисляет установленные языковые пакеты и планирует их удаление. Однако это может быть не UAC-дружественным.
Подходы к реализации удаления языковых пакетов зависят от того, как эти пакеты создаются. Если у вашего деинсталлятора есть загрузчик, .exe, а не просто .msi, то это может быть довольно просто. Загрузчик запускает процесс удаления для основного приложения. Если он успешен, он переходит к удалению языковых пакетов. И это было бы удобно для UAC: загрузчик запрашивает повышение прав при запуске, поэтому все процессы, которые он запускает, также будут повышены.