Удаление MSI: компонент получения сообщения не будет удален, поэтому значок не будет удален

У меня есть базовый проект MSI, в котором 2 или более его версий могут быть установлены параллельно. Каждая из них находится в другом месте, за исключением одного исполняемого файла, который является общим и имеет ярлык на рабочем столе.

В версии 1.0 MSI у меня есть компонент - установите файлы в \ Program Files \ prod_1.0 Компонент A общих файлов - установите exe в \ Program Files \ prod_shared Общий компонент ярлыка B - создайте ярлык на рабочем столе для exe в компоненте A

В версии 2.0 MSI у меня есть Component - установить файлы в \ Program Files \ prod_2.0 Shared files component A - install exe to \ Program Files \ prod_shared Shared shortcut component B - создать ярлык на рабочем столе для exe в компоненте A

GUID компонента одинаков для обеих версий MSI, и значок, который я использую в компоненте "Общий ярлык", не используется другими ярлыками. Проблема у меня в том, что если у меня 2 версии? устанавливается параллельно, а затем я удаляю одну версию. Я хочу, чтобы ярлык на рабочем столе был удален. Я добавил эту строку в код MsiSetComponentState (hMSI, «Shared_Shortcut_Desktop», INSTALLSTATE_ABSENT);

Но когда я удаляю, я получаю, что этот компонент сообщения не будет удален, поэтому значок «NewShortcut74_AE5D17DE4C4B4737ABB20A0D0358B69E.exe» не будет удален.

Есть идеи, как это решить?


person Epligam    schedule 03.06.2015    source источник


Ответы (1)


Если у этих двух ярлыков один и тот же идентификатор компонента, то, если вы не сказали чего-то еще, это просто общий компонент, и поскольку он используется обеими настройками, удаление одного из них не приведет к его удалению. Если у вас есть общий файл с тем же идентификатором компонента, установленный (скажем) в одно и то же расположение папки CommonFiles, то будет применяться то же правило - он не удалит файл, потому что он используется другим продуктом. Короткий ответ - использовать другой guid (и переименовать его тоже, возможно, в соответствии с версией продукта).

Какое отношение к этому имеет ссылка на MsiSetComponentState? Это означает, что вы написали код, чтобы попытаться удалить этот компонент, но MSI не удалит его, если он все равно поделится.

person PhilDW    schedule 03.06.2015