2010-12-24 3 views
5

Ho una funzione di aggiornamento nella mia app - scarica e verifica il programma di installazione (un setup.exe, creato con NSIS). Per dare il via in realtà l'aggiornamento, sono stato semplicemente facendo:QProcess :: startDetached bloccato da UAC (eseguendo un programma di aggiornamento)

QString path = .. absolute path to the downloaded file ... 
QProcess::startDetached(path, QStringList()); 

Questo funziona bene su XP - ma su Vista e Win7, non succede nulla, una volta completato il download. Se sfoglio l'aggiornamento scaricato ed eseguo manualmente, funziona perfettamente. Presumo che ciò che sta accadendo è che UAC sta bloccando l'installer al momento di CreateProcess, ma questo è il posto dove finiscono le mie conoscenze.

Complicazione aggiuntiva: quando eseguo una build di debug dalla riga di comando, i passaggi sopra funzionano - Ottengo il prompt UAC e posso eseguire il programma di installazione. Sono le versioni di rilascio, avviate dal menu di avvio/collegamento, che hanno il problema - presumo ci sia una differenza nel token di autenticazione quando si esegue da una shell di comando.

risposta

3

Se non si è admin e si chiama CreateProcess() su un file .exe con manifest "Vista" (o nessun manifest, ma un file .exe che Windows rileva come un programma di installazione (incluso NSIS)) la chiamata fallisce, è necessario utilizzare ShellExecute[Ex](). ShellExecute innescherà UAC chiederà se necessario ...

1

Questo sembra essere un bug Qt, vedere QTBUG-9761, la soluzione giusta è quella di utilizzare ShellExecute con lpOperation set per runas.

+0

Utilizzando il verbo runas sarà _force_ UAC elevazione, se non si specifica un verbo ShellExecute lo capirà da solo ... – Anders

+0

Corretto, grazie per le informazioni extra. – ismail

7

è anche possibile utilizzare

QDesktopServices::openUrl(QUrl::fromLocalFile(path)); 

potrebbe essere sorprendente e controintuitivo, ma funziona ed è più cross-platform

+0

Impressionante soluzione. Questo in realtà chiama ShellExecute in background. L'unico problema che vedo è che non porta la finestra UAC in alto –