2009-12-09 7 views
16

Come avviare la mia applicazione dopo l'installazione senza UI (o in modalità silenziosa)? Grazie!Lancia dopo l'installazione, senza interfaccia utente?


Avevo un programma di installazione con interfaccia utente che ha un'opzione da eseguire dopo l'installazione. Ora voglio che la mia applicazione si aggiorni scaricando ed eseguendo la nuova versione del programma di installazione in modalità silenziosa, ma dopo aver effettuato l'aggiornamento, non si avvierà di nuovo.

+0

Nota: sto utilizzando una proprietà denominata LAUNCHAPPONEXIT per controllare l'azione personalizzata che avvia la mia applicazione. E il suo valore predefinito è 1. – deerchao

+0

Ecco l'approccio che sto utilizzando per il lancio dopo l'installazione: http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/ – deerchao

risposta

15

Dal argomento MSDN sequencing custom actions:

Come nel caso delle azioni standard, azioni personalizzate che sono in programma l'InstallUISequence o corsa AdminUISequence solo se l'interfaccia utente interna è impostato sulla a livello intero.

Quindi immagino che l'azione personalizzata sia pianificata in una sequenza UI, non in InstallExecuteSequence. Prova la pianificazione l'azione personalizzata nella InstallExecuteSequence come questo:

<InstallExecuteSequence> 
    <Custom Action='LaunchApplication' After='InstallFiles'/> 
    </InstallExecuteSequence> 

dove "LaunchApplication" dovrebbe essere sostituita dalla Id del vostro elemento CustomAction.

modifica: ho guardato il instructions che hai seguito e non vedo l'azione personalizzata per avviare l'applicazione pianificata in qualsiasi sequenza. Viene attivato solo da un'azione dell'interfaccia utente (facendo clic sul pulsante Fine). Questo spiega perché non viene mai eseguito durante un'installazione invisibile all'utente.

modificare: intero campione (è un po 'sciatto come si cerca anche di eseguire l'azione personalizzata sulla disinstallazione, riparazione ecc, ma per qualche motivo non ho potuto ottenere la condizione "non installato" al lavoro)

<?xml version='1.0' encoding='utf-8'?> 
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> 
    <Product 
     Name='ProductName' 
     Id='*' 
     Language='1033' 
     Version='0.0.1' 
     Manufacturer='ManufacturerName' > 
     <Package 
      Keywords='Installer' 
      Description='Launch application demo' 
      Manufacturer='ManufactererName' 
      InstallerVersion='100' 
      Languages='1033' 
      Compressed='yes' 
      SummaryCodepage='1252'/> 

     <Media Id='1' Cabinet='test.cab' EmbedCab='yes'/> 

     <Directory Id='TARGETDIR' Name="SourceDir"> 
     <Directory Id='ProgramFilesFolder'> 
      <Directory Id='TestFolder' Name='Test' > 
       <Component Id="ExeComponent" Guid="*"> 
        <File Id="ExeFile" Source="c:\windows\notepad.exe" /> 
       </Component> 
      </Directory> 
     </Directory> 
     </Directory> 

     <Feature Id='Complete' 
      Display='expand' 
      Level='1' 
      Title='Test' 
      Description='Test'> 
     <ComponentRef Id="ExeComponent" /> 
     </Feature> 

     <InstallExecuteSequence> 
     <Custom Action='LaunchInstalledExe' After='InstallFinalize'/> 
     </InstallExecuteSequence> 

     <CustomAction Id="LaunchInstalledExe" 
     FileKey="ExeFile" 
     ExeCommand="" 
     Execute="immediate" 
     Impersonate="yes" 
     Return="asyncNoWait" /> 

    </Product> 
</Wix> 
+0

ho provato: LAUNCH_APP_ON_EXIT Sembra che non riesco a farlo funzionare, con o senza UI, anche se ho eliminato la condizione LAUNCH_APP_ON_EXIT. Puoi fornire un semplice esempio che funzioni? Grazie! – deerchao

+0

Grazie per il tuo esempio. Ho aggiunto una proprietà UPDATING_AUTOMATICALLY per controllare se l'azione personalizzata è in esecuzione o meno. – deerchao

+0

Poi passo UPDATING_AUTOMATICALLY = 1 nella riga di comando. – deerchao

1

Suppongo che si stia avviando l'app da un'azione personalizzata, che viene attivata tramite una proprietà associata alla casella di controllo. In questo caso, puoi provare a specificarla come argomento della riga di comando su setup.exe. Dire, se l'azione personalizzata è legato alla proprietà LAUNCH_NEW_VERSION MSI, è possibile chiamare setup.exe come questo:

setup.exe /q LAUNCH_NEW_VERSION=1 

Il programma di avvio automatico di installazione standard dovrebbe passare tale proprietà/valore al motore MSI. In caso contrario, potresti prendere in considerazione l'idea di richiamare direttamente il .msi invece di chiamare l'exe bootstrapper per eseguire il tuo programma di installazione.

+0

Sì, sto utilizzando una proprietà denominata LAUNCHAPPONEXIT per controllare l'azione personalizzata e il suo valore predefinito è impostato su 1. Ma il programma non verrà avviato in modalità silenziosa. Ho provato setup.exe/q LAUNCHAPPONEXIT = 1 Non funziona neanche. – deerchao

+0

prova a passare attraverso il .msi direttamente invece del bootstrip setup.exe. –

+0

Ho provato più volte senza fortuna: "msiexec/i DepotM.Setup.msi/qn LAUNCHAPPONEXIT = 1" Tuttavia, se si passa a/qf (che mostra l'interfaccia utente completa) viene eseguito dopo l'installazione./qb non ha funzionato neanche. – deerchao

3

Nella mia soluzione finale ho usato due proprietà, uno per l'interfaccia utente (LAUNCH_APP_ON_EXIT), uno per gli argomenti della riga di comando (UPDATING_AUTOMATICALLY).

devo fare questo perché se corro il CustomAction dopo InstallFinalize in modalità full interfaccia utente, l'applicazione dovrebbe iniziare prima di si fa clic sul pulsante "Fine".

Ora posso chiamare setup.exe/qn UPDATING_AUTOMATICALLY = 1 nel mio programma da aggiornare.

Qui è tutto:

<Property Id="LAUNCH_APP_ON_EXIT" Value="1" /> 
<Property Id="UPDATING_AUTOMATICALLY" Value ="0" /> 

<CustomAction Id="LaunchApplication" FileKey="mainExecutableFile" ExeCommand="" Execute="immediate" Impersonate="yes" Return="asyncNoWait" /> 

<UI> 
    <!-- explainations: http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/ --> 
    <UIRef Id="MyWixUI_InstallDir" /> 
    <UIRef Id="WixUI_ErrorProgressText"/> 

    <Publish Dialog="MyExitDialog" Control="Finish" Order="1" Event="DoAction" Value="LaunchApplication">LAUNCH_APP_ON_EXIT</Publish> 
</UI> 

<InstallExecuteSequence> 
    <Custom Action='LaunchApplication' After='InstallFinalize'>UPDATING_AUTOMATICALLY = 1</Custom> 
</InstallExecuteSequence> 
+0

Questo è stato molto utile. Nella mia situazione volevo utilizzare la casella di controllo dell'interfaccia utente standard per avviare il programma * se è stata visualizzata l'interfaccia utente ... ma se l'installazione è stata eseguita silenziosamente, volevo avviarla automaticamente. L'aggiunta della proprietà UPDATING_AUTOMATICALLY alla sezione era fondamentale. Grazie! – stuzor

1

Questo è l'approccio che ho preso.

<Property Id="WixShellExecTarget" Value="[#(the id of your exe here)]" /> 
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" /> 

Questo eseguirà quale ID file immesso nel valore. È necessario [#]. L'ho usato e l'ho eseguito tramite l'interfaccia utente, ma dovresti essere in grado di chiamare questa azione personalizzata ovunque e funziona.