+ Rispondi al Thread
Pagina 2 di 2 primaprima 12
Visualizzazione dei risultati da 11 a 17 su 17

Discussione: [Inno Setup] Controllare se il programma è già installato.

  1. #11
    abici non è in linea Novello
    Post
    21
    Sì, sarebbe la condizione ideale, ma io non conosco il pascal e qui si tratta di creare già delle routine in cui bisogna perderci un bel po' di tempo per scriverle e provarle.
    Appena posso faccio qualche prova. grazie!

  2. #12
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Allora visto che questo codice serve non solo a te (ci stò preparando un microarticolo) eccotelo già fatto, sostituisci a NomeProgramma quello che vuoi cercare e chiedi se c'è qualcosa nel codice che non capisci

    codice:
    [Code]
    {la forza dell'abitudine scrivo le funzioni come si usano in vb ;)}
    Function Left(s_String: String; n_Len: Integer):string;
    Var
      s_Elabora: string;
      
      Begin
        s_Elabora:= s_String
        Delete (s_Elabora, n_Len +1, Length(s_String) - n_Len +1);
        Result := s_Elabora
      End;
      
    Function Right(s_String: String; n_Len: Integer):string;
    Var
      s_Elabora: string;
      
      Begin
        s_Elabora:= s_String
        Delete (s_Elabora, 1, Length(s_String) - n_Len );
        Result := s_Elabora
      End;
    
    
    
    Function ControllaPresenzaProgrammaInChiave(n_ChiaveMadre:Integer; s_Percorso:String):boolean;
    
    Var
      KeyProgrammi: TArrayOfString;
      I_Iteratore: Integer;
      s_NomeProgramma: String;
      b_GiaInstallato: boolean;
    
      Begin
      
        {Scrivo il nome del programma in una variabile e in maiuscolo per comodità (dopo porterò maiscolo anche il confronto)}
        s_NomeProgramma:=Uppercase('NomeProgramma');
        
        {Inizializzo a false la variabile di controllo}
        b_GiaInstallato:= False;
      
        {Se esiste la chiave delle "disinstallazioni"}
        If RegKeyExists(n_ChiaveMadre,s_Percorso) Then
          Begin
            {Se la lettura delle sottochiavi della chiave unistall in un array riesce}
            If RegGetSubkeyNames(n_ChiaveMadre, s_Percorso, KeyProgrammi) then
            Begin
              {Scorro tutti gli elementi nell'array}
              For I_Iteratore := 0 To GetArrayLength(KeyProgrammi)-1 Do
                Begin
                  {Controllo se la parte iniziale della chiave è il programma evitando così di calcolare il numero installazione (_is1 ad esempio)}
                  If Left(Uppercase(KeyProgrammi[i_Iteratore]), Length(s_NomeProgramma)) = s_NomeProgramma Then
                    Begin
                      {Metto a true la variabile di controllo}
                      b_GiaInstallato:= True;
                    End;
                End;
            End;
          End;
    
        {Il risultato della funzione è la variabile di controllo}
        Result:= b_GiaInstallato
      
      End;
    
    Function MaiInstallato():boolean;
    
    Var
      KeyUtente: TArrayOfString;
      I_Iteratore: Integer;
      b_GiaInstallato: boolean;
    
      Begin
    
        {Inizializzo a false la variabile di controllo installazione programma}
        b_GiaInstallato:= False;
      
        {Se la lettura delle sottochiavi di HKEY_USERS in un array riesce}
        If RegGetSubkeyNames(HKEY_USERS, '', KeyUtente) then
          Begin
            {Scorro tutti gli elementi nell'array}
            For I_Iteratore := 0 To GetArrayLength(KeyUtente)-1 Do
              Begin
                {Controllo se per quell'utente è stato installato il programma incriminato}
                If ControllaPresenzaProgrammaInChiave(HKEY_USERS,KeyUtente[I_Iteratore] + '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') Then
                  Begin
                    {Metto a true la variabile di controllo}
                    b_GiaInstallato:= True;
                  End;
              End;
          End;
          
          {Controllo se è stato installato per tutti gli utenti è stato installato il programma incriminato}
          If ControllaPresenzaProgrammaInChiave(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') Then
            Begin
              {Metto a true la variabile di controllo}
              b_GiaInstallato:= True;
            End;
    
        {Il risultato della funzione è ovviamente la negazione della variabile di controllo}
        Result:= Not(b_GiaInstallato);
    
      End;
    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. #13
    abici non è in linea Novello
    Post
    21
    Ho ridotto un po' il codice per adattarlo alle mie esigenze:

    codice:
    Function CONTROLLA(): boolean;
      Var
        I: Integer;
        REG_UTENTE: TArrayOfString;
        NOME_PROGRAMMA: String;
    
      Begin
        Result:= False;
        NOME_PROGRAMMA:= 'IDApplicazione_is1'
        If RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + NOME_PROGRAMMA) Then
          Begin
            Result:= True;
          End
        Else
          Begin
            If RegGetSubkeyNames(HKEY_USERS, '', REG_UTENTE) then
              Begin
                For I:= 0 To GetArrayLength(REG_UTENTE)-1 Do
                  If RegKeyExists(HKEY_USERS, REG_UTENTE[I]+'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + NOME_PROGRAMMA) Then
                    Begin
                      Result:= True;
                    End
              End
          End
      End;
    Ma, per i problemi relativi ai privilegi amministrativi che ti ho segnalato nei post precedenti, non sempre da i risultati che ci si attende.
    Infatti, funziona perfettamente se l'utente che ha installato il programma è amministratore.
    Se, invece, l'utente che ha installato il programma non è amministratore la procedura può vedere la chiave di registro solo se l'utente è loggato, altrimenti, se l'utente non è loggato, la procedura non vede la chiave cercata. Inoltre, in quest'ultimo caso, il programma installato non appare neanche in installazione applicazioni del pannello di controllo.
    Questo è ciò che accade con WindowsXP, non so cosa avviene con Windows Vista o Windows 7.

  4. #14
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Questo è un problema, avevo dimenticato il discorso che vuoi far installare questo programma anche agli account utente limitati, il dramma è che secondo le policy di windows è perfettamente corretto che tu non veda quelle zone del registro se sei un utente limitato, ora il problema è che l'utente limitato non vede quello che fa l'utente amministratore, quindi si aprono due possibili alternative:

    Usi il metodo che ti ho suggerito, ma richiedi i privilegi utente per installar, attenzione non che l'utente loggato sia Administrator, l'importante è che il setup abbia quei diritti ed è sufficente usare:

    PrivilegesRequired=admin

    Nella sezione setup per far apparire in caso di utente non amministratore una richiesta password che dia i poteri di amministratore al setup ma lasci l'utente come limitato.



    Oppure si passa a metodi molto poco ortodossi tipo creare una cartella sotto all user e controllare la presenza di quella, oppure creare (orrore) una voce in HKEY_LOCAL_MACHINE\software e controllare quella, ma anche qui siamo di fronte a un problema di fondo, un utente limitato quanti diritti ha su quella cartella/chiave che in teoria contiene informazioni per tutti gli utenti quindi amministratori compresi?

    In teoria il tuo setup dovrebbe fare una cosa che un utente limitato semplicemente non può fare, ma se proprio hai la necessità inventeremo un metodo per aggirare il problema, intanto dimmi se sarebbe accettabile chiedere i permessi di amministratore per eseguire il setup (come sarebbe giusto fare)
    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

  5. #15
    abici non è in linea Novello
    Post
    21
    No...preferisco non dare permessi da amministratore se non lo si è!

    Allora, questo è il metodo che infine ho deciso di seguire:

    1) il comando DisableDirPage=no del [Setup] solo se amministratore (con utente senza privilegi si installa in una cartella fissa: DisableDirPage=yes);
    2) controllo la chiave in HKLM;
    3) se la chiave HKLM non esiste, controllo l'esistenza del file NomeProgramma.exe (serve se l'installazione è stata già fatta da un utente senza privilegi);
    4) all'avvio del setup, se il programma non è ancora installato e l'utente non è amministratore, faccio apparire un messaggio che avvisa la possibilità di installare lo stesso ma che è opportuna una installazione da amministratore;

    In questo modo mi sembra che il controllo copra abbastanza il ventaglio delle possibilità. L'unica situazione che rimane scoperta è che un utente senza privilegi installi il programma e poi sposti manualmente la cartella dell'applicazione in un'altra posizione. Ma questo è comunque incontrollabile! E, mica possiamo stare completamente nella testa di tutti quelli che usano il pc?

    Sono riuscito a realizzare il codice per i controlli tranne che per il settaggio yes/no del comando DisableDirPage del [Setup].

    Ho provato in questo modo ma non funziona:

    codice:
    [Setup]
    DisableDirPage={Code:PAGINA}
    
    
    Function PAGINA(Param: String): String;
      Begin
        If IsAdminLoggedOn() Or IsPowerUserLoggedOn() Then
          Begin
            Result:= 'no';
          End
        Else
          Begin
            Result:= 'yes';
          End
      End;
    C'è la possibilità di settare da codice il parametro di DisableDirPage?
    Se non è possibile l'unica cosa da fare è settarlo sempre su yes: si installa l'applicativo in una cartella fissa e non mi pongo più problemi!

  6. #16
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Luogo
    Darfo Boario Terme (BS)
    Post
    1,164
    Quote Originariamente inviato da abici Visualizza il messaggio
    No...preferisco non dare permessi da amministratore se non lo si è!
    Ma il tuo utente per installare il programma deve fare cose riservate agli amministratori, quindi.... COmunque ok se hai questa esigenza vedremo di aggirare il problema

    Quote Originariamente inviato da abici Visualizza il messaggio
    C'è la possibilità di settare da codice il parametro di DisableDirPage?
    Se non è possibile l'unica cosa da fare è settarlo sempre su yes: si installa l'applicativo in una cartella fissa e non mi pongo più problemi!
    Che io sappia non è possibile, per chiedere la dir in caso di amministrator e non chiederla in caso di utente devi usare un pò di codice, devi seguire questi passi:
    • Metti DisableDirPage=yes
    • All'initialize del setup controlli se hai a che fare con un utente amministratore o no
    • Se è amministratore crei una pagina con CreateInputDirPage che permetta la scelta di una dir per mettere il programma
    • Crei una funzione PathProgramma che restituisce una stringa, in base al fatto se l'utente è amministratore o meno, se è amministratore restituisce la dir settata nella pagine che abbiamo creato noi "Page.Values[0]", altrimenti restituisce lo stesso valore che c'è in DefaultDirName
    • Nella sezione Files e in tutte le altre in cui potrebbe servire al posto di usare la cosatente {app} usi la funzione PathProgramma

    Questo è l'unico metodo che conosco per fare quello che chiedi.
    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

  7. #17
    abici non è in linea Novello
    Post
    21
    Il programma funziona bene anche se non hai i permessi di amministratore. Il problema si pone solo in fase di installazione per controllare che il software non sia installato più volte sullo stesso computer.

    Ti ringrazio per le indicazioni sulla procedura da seguire per settare 'DisableDirPage'.
    Appena posso vedo di combinare qualcosa!

+ Rispondi al Thread
Pagina 2 di 2 primaprima 12

Permessi di invio

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