2011-11-24 23 views
5

Me pregunto si es posible ejecutar manualmente un elemento RemoveFolderEx a partir de una acción personalizada. Supongo que probablemente no, pero alguien puede saber una forma que yo no conozco.Wix: ¿Es posible ejecutar manualmente un elemento RemoveFolderEx a partir de una acción personalizada?

Mi problema es que quiero ejecutar el elemento RemoveFolderEx pero solo en un UNINSTALL verdadero, sin embargo mi programa lo ejecuta cuando actualiza como lo he configurado para desinstalarlo antes de reinstalarlo.

Lo intenté a través de este método Wix: condition on property not working Sin embargo, no funcionó y aún se ejecutó al hacer una reinstalación.

Lo único que se me ocurre es poder quitar manualmente RemoveFolderEx de una acción personalizada que sé que ejecuto en el punto correcto y solo en una verdadera desinstalación. Tal vez mi acción personalizada podría usar un C++ dll y luego manualmente agregar el comando a la interfaz MSI, pero si voy tan lejos, podría ser mejor escribir por completo la lógica de eliminación.

Gracias. Neil


EDIT: finalmente conseguí este funcionamiento, aquí hay un ejemplo de wix para mostrar lo que hice.

<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>  

El P.REMOVEDATAFOLDER propiedad única consigue el sistema en un cierto desinstalación inmediatamente después DATADIR se lee desde el registro pero antes de la acción CostInitialize.

Respuesta

4

me gustaría utilizar el siguiente enfoque. No condicione el funcionamiento de RemoveFolderEx, pero use una acción personalizada condicionada para establecer el valor apropiado para la propiedad de destino.

+0

RemoveFolderEx no se puede condicionar, pero las acciones personalizadas pueden serlo. Así que ejecutar una acción personalizada condicionada que luego se llamó un elemento RemoveFolderEx tendría el comportamiento que deseo. La pregunta que ligé es mi intento de poner una condición en un componente que contiene un elemento RemoveFolderEx, pero esto no funciona como me gustaría. – Neil

+0

Es complicado llamar a RemoveFolderEx desde una acción personalizada. Lo que propongo es más simple. Deje el RemoveFolderEx sin cambios y simplemente establezca su propiedad a partir de una acción personalizada. – Ciprian

+0

Lo siento, nunca entendí la primera vez, esto es en realidad me explico. Lo intentaré y te responderé si fue exitoso. – Neil

0

Tomando un consejo de this question, la condición que denota desinstalación es REMOVE="All" AND NOT UPGRADINGPRODUCTCODE.

Algo como esto puede funcionar:

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

Este fue mi enfoque original; sin embargo, esto nunca funcionaría porque el componente nunca se instalaría y, por lo tanto, nunca podría eliminarse. Si lees la pregunta que he vinculado, entra en muchos más detalles sobre este enfoque. – Neil

Cuestiones relacionadas