MSI удалить: компонент получить сообщение не будет удален, так что значок не будет удален
У меня есть базовый проект MSI, что две или более его версий могут быть установлены параллельно. Каждая из них находится в другом месте, за исключением одного исполняемого файла, который является общим и имеет ярлык на рабочем столе.
В версии 1.0 MSI у меня есть Компонент - установить файлы в \Program Files\prod_1.0 Компонент общих файлов A - установить exe в \Program Files\prod_shared Общий компонент B быстрого доступа - создать ярлык на рабочем столе для запуска в компоненте A
В версии 2.0 MSI у меня есть Компонент - установить файлы в \Program Files\prod_2.0 Компонент общих файлов A - установить exe в \Program Files\prod_shared Общий компонент B быстрого доступа - создать ярлык на рабочем столе для запуска в компоненте A
Идентификатор GUID компонента одинаков для обеих версий MSI, и значок, который я использую в компоненте "Общий ярлык", не используется другими ярлыками. Проблема у меня в том, что если у меня 2 версии? устанавливается параллельно, а затем я удаляю одну версию, я хочу, чтобы ярлык на рабочем столе был удален. Я добавил эту строку в код MsiSetComponentState(hMSI,"Shared_Shortcut_Desktop",INSTALLSTATE_ABSENT);
Но при удалении я получаю, что этот компонент сообщения не будет удален, поэтому значок "NewShortcut74_AE5D17DE4C4B4737ABB20A0D0358B69E.exe" не будет удален.
Есть идеи как это решить?
1 ответ
Если эти два ярлыка имеют одинаковую направляющую компонента, то, если вы не сказали что-то еще, это действительно просто общий компонент, и поскольку он используется обеими установками, удаление одного из них не удалит его. Если у вас был общий файл с тем же идентификатором компонента, установленный (скажем) в ту же папку папки CommonFiles, то было бы применено то же правило - он не будет удалять файл, потому что он используется другим продуктом. Короткий ответ - использовать другой guid (и переименовать его тоже, возможно, с версией продукта).
При чем здесь ссылка на MsiSetComponentState? Это означает, что вы написали некоторый код, чтобы попытаться удалить этот компонент, но MSI не удалит его, если он все равно будет доступен.