Деинсталиране на MSI: компонентът за получаване на съобщение няма да бъде премахнат, така че иконата няма да бъде премахната

Имам основен MSI проект, който може да инсталира 2 или повече негови версии паралелно, всяка на различно място, с изключение на един exe, който е споделен и има пряк път на работния плот.

Във версия 1.0 MSI имам Component – ​​инсталирайте файлове в \Program Files\prod_1.0 Споделени файлове компонент A - инсталирайте exe в \Program Files\prod_shared Споделен пряк път компонент B - създайте пряк път на работния плот към exe в компонент A

Във версия 2.0 MSI имам Component – ​​инсталирайте файлове в \Program Files\prod_2.0 Споделени файлове компонент A - инсталирайте exe в \Program Files\prod_shared Споделен пряк път компонент 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