+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [Inno Setup] Chiudere processo attivo.

  1. #1
    abici non è in linea Novello
    Post
    21

    Question [Inno Setup] Chiudere processo attivo.

    Ciao,
    ho bisogno del vostro aiuto.
    Ho cercato in rete, su questo forum e nell'help di Inno Setup, ma non ho trovato soluzioni.

    In fase di disinstallazione, se vi sono dei processi del software attivi, questi non vengono disinstallati da Inno Setup.
    Esiste un comando da poter inserire in "[code] function InitializeUninstall()" che chiuda determinati processi prima di proseguire con la disinstallazione del programma?
    E' vero, posso inserire un messaggio all'utente che gli imponga di chiudere tutti i processi prima di far partire l'uninstall ma, se un processo attivo lavora in background, non è una soluzione comoda per gli utenti.

    Grazie!!!!


  2. #2
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Fare quello che chiedi si può, ma non sarebbe più semplice sfruttare i mutex?

    Oltretutto è anche più corretto, terminare brutalmente un processo non è una cosa bellissima, oppure il problema è che gli utenti non riescano a chiudere il tuo programma in seguito all'esplicita richiesta di Inno Setup?
    Se sei nuovo e vuoi aiuto il miglior modo che io ho trovato per ottenerlo è porre le domande in modo intelligente
    Se hai delle domande siamo qui per tentare di risponderti, se hai delle risposte siamo qui per ascoltarle
    Noi siamo una comunità, una bella comunità e funzioniamo sempre meglio se ognuno cerca di seguire al massimo il nostro regolamento

  3. #3
    abici non è in linea Novello
    Post
    21
    Non è un problema di richiesta di Inno Setup: viene disinstallato tutto tranne le procedure attive, con il classico messaggio finale di eliminare manualmente alcuni elementi che non ha potuto disinstallare poichè attivi.
    Le procedure che vorrei terminare automaticamente sono file attivi che non hanno problemi di interazione con il software. Ad esempio i file .chm che se dimenticati aperti non vengono cancellati.
    Per la procedura myprogram.exe eventualmente avviata al momento della disinstallazione, pensavo di inserire un controllo in "[code] function InitializeUninstall()" che stoppi la disinstallazione e chieda all'utente di chiudere prima il software. Questo è l'unico stato che è opportuno non terminare brutalmente.

    Mi consigli di sfruttare i mutex? Non conosco la procedura. Ora dò uno sguardo!

  4. #4
    abici non è in linea Novello
    Post
    21
    Alla fine, dopo ore di ricerche , ho risolto in questo modo:

    Per il controllo dell'applicativo avviato, ho inserito nel codice del programma
    Public myMutex As System.Threading.Mutex = New Threading.Mutex(False, "NomeProgramma")
    e in [Setup] di InnoSetup
    AppMutex=NomeProgramma

    Mentre, per la chiusura d'imperio dei processi avviati o dei file aperti, ho inserito in [UninstallRun]
    Filename: taskkill; Parameters: /f /im ProcessX.exe; WorkingDir: {sys}; Flags: runhidden

    Ritieni che la procedura sia corretta? Ci sono altre possibilità per arrivare allo stesso risultato?

  5. #5
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Beh, è un ottima idea complimenti, ma ha delle limitazioni che devi calcolare, uno:

    Quote Originariamente inviato da InstallationOrder
    Note that the uninstaller processes [UninstallRun] and [UninstallDelete] entries in the same order they appear in the script (not in reverse order).
    Indi per cui devi fare in modo di scrivere lo script nel giusto ordine in modo da terminare i processi prima di cancellare qualsiasi cosa, a questo proposito io ti consiglierei di utilizzare un altra funzione/evento, cioè

    Function InitializeUninstall(): Boolean;

    In modo da tagliare la testa al toro e non avere problemi (oppure crea una pagina apposta di attesa e falla processare prima di eliminare i file, fai un pò tu).

    Secondo problema: il comando taskkill deve essere presente sul sistema operativo dell'utente finale, qui ad esempio non si parla ne di Win2000 o di Win Xp Home (purtroppo non ho sottomano una macchina virtuale per fare le prove e non so dirti se in realtà c'è o no), problema affrontabile (ridistribuendo il file taskkill.exe, filtrando sull'OS, etc), ma devi tenerne conto.
    Se sei nuovo e vuoi aiuto il miglior modo che io ho trovato per ottenerlo è porre le domande in modo intelligente
    Se hai delle domande siamo qui per tentare di risponderti, se hai delle risposte siamo qui per ascoltarle
    Noi siamo una comunità, una bella comunità e funzioniamo sempre meglio se ognuno cerca di seguire al massimo il nostro regolamento

  6. #6
    abici non è in linea Novello
    Post
    21
    Grazie per i complimenti, ma non è farina del mio sacco. Ho trovato la procedura in rete e l'ho semplicemente adattata alle mie esigenze.

    Da quanto ho letto e, in parte verificato, taskkill.exe è presente in Windows XP Professional, Vista e 7. In tutti i SO (almeno da Windows XP in poi) è presente tskill.exe che, per la chiusura dei processi attivi, ha delle funzionalità diverse da taskkill.exe. Non ho cmq potuto verificare su Vista.

    Il mio programma è sviluppato solo per sistemi Windows XP/Vista/7, quindi, tenendo conto dei consigli che mi hai dato, ho eliminato la riga in [UninstallRun] e ho riscritto il codice in questo modo:

    codice:
    Function InitializeUninstall(): Boolean;
      Var
        CODE: Integer;
      Begin
         If FileExists(ExpandConstant('{win}\system32\taskkill.exe')) Then
          Begin
            Exec(ExpandConstant('{win}\system32\taskkill.exe'), '/f /im programX.exe', '', SW_HIDE, ewWaitUntilTerminated, CODE);
            Exec(ExpandConstant('{win}\system32\taskkill.exe'), '/f /fi "Windowtitle eq programX-Guida"', '', SW_HIDE, ewWaitUntilTerminated, CODE);
          End
        Else
          Begin
            Exec(ExpandConstant('{win}\system32\tskill'), 'programX', '', SW_HIDE, ewWaitUntilTerminated, CODE);
            Exec(ExpandConstant('{win}\system32\tskill'), 'hh', '', SW_HIDE, ewWaitUntilTerminated, CODE);
          End
      End;

    Se taskkill.exe esiste utilizza questa procedura (più completa e performante), altrimenti viene utilizzata tskill.

    Cosa ne pensi ora?

  7. #7
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Dovrebbe funzionare, anche se io chiederei all'utente se è daccordo prima, una cosa del tipo "Il programma è in esecuzione, sicuro di volerlo disinstallare?", ma questa è una scelta tua, per il resto direi che va bene.
    Se sei nuovo e vuoi aiuto il miglior modo che io ho trovato per ottenerlo è porre le domande in modo intelligente
    Se hai delle domande siamo qui per tentare di risponderti, se hai delle risposte siamo qui per ascoltarle
    Noi siamo una comunità, una bella comunità e funzioniamo sempre meglio se ognuno cerca di seguire al massimo il nostro regolamento

  8. #8
    abici non è in linea Novello
    Post
    21
    Quote Originariamente inviato da spikexx84 Visualizza il messaggio
    ....... io chiederei all'utente se è daccordo prima, una cosa del tipo "Il programma è in esecuzione, sicuro di volerlo disinstallare?", ...........
    Ecco allora l'ultima stesura (spero definitiva).
    Ho spostato il codice sotto la procedura CurUninstallStepChanged.

    codice:
    Procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
      Var
        CODE: Integer;
      Begin
        If CurUninstallStep = usUninstall Then
          Begin
            If FileExists(ExpandConstant('{win}\system32\taskkill.exe')) Then
              Begin
                Exec(ExpandConstant('{win}\system32\taskkill.exe'), '/f /im programX.exe', '', SW_HIDE, ewWaitUntilTerminated, CODE);
                Exec(ExpandConstant('{win}\system32\taskkill.exe'), '/f /fi "Windowtitle eq programX*"', '', SW_HIDE, ewWaitUntilTerminated, CODE);
              End
            Else
              Begin
                Exec(ExpandConstant('{win}\system32\tskill'), 'programX', '', SW_HIDE, ewWaitUntilTerminated, CODE);
                Exec(ExpandConstant('{win}\system32\tskill'), 'hh /a', '', SW_HIDE, ewWaitUntilTerminated, CODE);
              End
          End
      End;
    In questo modo vengono chiuse le procedure attive solo dopo che l'utente ha confermato che vuole disinstallare il software. Inoltre, non dovrebbero esserci conflitti con il processo di disinstallazione, poichè le procedure attive vengono chiuse prima che questo inizi.
    Ma è proprio così o potrebbero verificarsi sovrapposizioni dei processi?

  9. #9
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Di preciso non lo so, ma non puoi semplicemente far tu una domanda nella Initialize con una msgbox che sei a posto?
    Se sei nuovo e vuoi aiuto il miglior modo che io ho trovato per ottenerlo è porre le domande in modo intelligente
    Se hai delle domande siamo qui per tentare di risponderti, se hai delle risposte siamo qui per ascoltarle
    Noi siamo una comunità, una bella comunità e funzioniamo sempre meglio se ognuno cerca di seguire al massimo il nostro regolamento

  10. #10
    abici non è in linea Novello
    Post
    21
    Quote Originariamente inviato da spikexx84 Visualizza il messaggio
    Di preciso non lo so, ma non puoi semplicemente far tu una domanda nella Initialize con una msgbox che sei a posto?
    Sì sì...ho già fatto un controllo stoppando la procedura, con una msgbox di prova, dopo l'If CurUninstallStep. Sembra fili tutto come da intenzioni: i processi attivi vengono chiusi prima che inizi la disinstallazione.

    Ok...allora, se non sollevi altre eccezioni, lascio tutto così!

    Grazie per l'aiuto e tanti auguri per le prossime festività.

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi