2011-11-24 13 views
5

Zastanawiam się, czy można ręcznie uruchomić element RemoveFolderEx z niestandardowej akcji. Zgaduję, że nie, ale ktoś może znać sposób, o którym nie wiem.Wix: Czy można ręcznie uruchomić element RemoveFolderEx z niestandardowej akcji?

Mój problem polega na tym, że chcę uruchomić element RemoveFolderEx, ale tylko przy prawdziwym UNINSTALL, ale mój program wykonuje go podczas aktualizacji, ponieważ ustawiłem go jako odinstalowany przed ponowną instalacją.

Próbowałem go za pomocą tej metody Wix: condition on property not working jednak nie działa i nadal działa podczas ponownej instalacji.

Jedyne, co mogę wymyślić, to możliwość ręcznego ustawienia RemoveFolderEx z niestandardowej akcji, o której wiem, że uruchamiam we właściwym miejscu i tylko w prawdziwym odinstalowaniu. Być może moja niestandardowa akcja mogłaby skorzystać z biblioteki dll C++, a następnie ręcznie dodać komendę do interfejsu MSI, ale jeśli zajdzie taka możliwość, równie dobrze mógłbym napisać logikę usuwania samemu.

Dzięki. Neil


EDYCJA: W końcu udało mi się to zrobić, oto kilka przykładów, aby pokazać, co zrobiłem.

<Property Id='P.REMOVEDATAFOLDER' Secure='yes' /> 

<DirectoryRef Id="DATADIR">   
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes"> 
     <util:RemoveFolderEx On="uninstall" Property="P.REMOVEDATAFOLDER" /> 
    </Component> 
</DirectoryRef> 

<CustomAction Id="CA.SetDataFolder" Property="P.REMOVEDATAFOLDER" Value='[DATADIR]' /> 

<InstallExecuteSequence>   
    <Custom Action="CA.SetDataFolder" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom> 
</InstallExecuteSequence>  

Obiekt P.REMOVEDATAFOLDER tylko zostanie ustawiony na prawdziwej deinstalacji natychmiast po DATADIR jest odczytywana z rejestru, ale przed działaniem CostInitialize.

Odpowiedz

4

chciałbym używać następujące podejście. Nie należy usuwać operacji RemoveFolderEx, ale należy użyć warunkowej akcji niestandardowej, aby ustawić odpowiednią wartość dla właściwości docelowej.

+0

RemoveFolderEx nie może być warunkowany, ale mogą to być akcje niestandardowe. Uruchomienie warunkowej akcji niestandardowej, która następnie nazwałaby element RemoveFolderEx, zachowałoby pożądane zachowanie. Pytanie, które łączyłem, to moja próba postawienia warunku na komponencie zawierającym element RemoveFolderEx, ale to nie działa tak jakbym chciał. – Neil

+0

Trudno jest wywołać RemoveFolderEx z niestandardowej akcji. To, co proponuję, jest prostsze. Pozostaw RemoveFolderEx niezmieniony i po prostu ustaw jego właściwość z niestandardowej akcji. – Ciprian

+0

Przepraszam, że nigdy nie zrozumiałem, po raz pierwszy, to jest naprawdę huk. Spróbuję i skontaktuję się z Tobą, czy udało się. – Neil

0

Przyjmując porady od this question, warunkiem deinstalacji jest REMOVE="All" AND NOT UPGRADINGPRODUCTCODE.

Coś jak to może działać:

<Component Id="RemoveMyFolder"> 
    <Condition> REMOVE="All" AND NOT UPGRADINGPRODUCTCODE </Condition> 
    <RemoveFolderEx ... /> 
</Component> 
+0

To było moje oryginalne podejście, ale to nigdy by nie zadziałało, ponieważ komponent nigdy nie byłby zainstalowany, a zatem nigdy nie mógłby zostać usunięty. Jeśli przeczytasz pytanie, które połączyłem, bardziej szczegółowo opisuję to podejście. – Neil

Powiązane problemy