Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
pascal, leggere programmi installati
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 14 Dic 2011 23:05    Oggetto: pascal, leggere programmi installati Rispondi citando

La mia necessità è quella, dato un computer con su windows XP, di poter capire quali programmi sono installati sul sistema e salvare su un file di testo il nome dei programmi e relativa versione.

Il linguaggio che sto adoperando è il pascal (utilizzando l'IDE lazarus), ma penso che la domanda possa essere interessante anche se volessi utilizzare altri linguaggi.

Il modo che avrei trovato per fare questo elenco sarebbe quello di sfruttare il resgistro di windows con un pseudo-codice analogo al seguente:

Reg := TRegistry.Create(KEY_READ);
Reg.RootKey := HKEY_LOCAL_MACHINE;
AssignFile(prova,'prova.txt');
reset(repository); //accede al file

while in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
do
nome:=Reg.Readstring(DisplayName);
versione:=Reg.Readstring(DisplayVersion);
writeln(prova, nome);
writeln(prova,versione)
end do

la domanda è: come faccio a controllare tutte le voci in Uninstall? (suppongo siano quelle che controllare windows per la schermata aggiungi/rimuovi) ad esempio VLC crea la voce VLC, GIMP la voce WinGimp-2.0_is1, lazarus crea Lazarus_is1 e via dicendo, come faccio a scorrerle tutte?
Se volessi darli a mano dovrei (mi sembra) dare:
Reg.OpenKeyReadOnly(SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\VLC)
nome:=Reg.Readstring(DisplayName);
versione:=Reg.Readstring(DisplayVersion);
writeln(prova, nome);
writeln(prova,versione)
Reg.OpenKeyReadOnly(SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinGimp-2.0_is1)
nome:=Reg.Readstring(DisplayName);
versione:=Reg.Readstring(DisplayVersion);
writeln(prova, nome);
writeln(prova,versione)

e via dicendo, il fatto che io non sappia a priori i nomi di tutte le cartelle dentro a version fa si che io non sappia come comportarmi.

Spero che ci sia qualcuno in grado di darmi una mano!

Ovviamente se qualcuno conosce un altro modo (usando il pascal!) per ottenere un elenco dei programmi installati su windows è il benvenuto per darmi consigli!
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11566
Residenza: Tokelau

MessaggioInviato: 15 Dic 2011 10:00    Oggetto: Rispondi citando

cercando con Google vedo che dovrai creare una lista di stringhe e riempirla con i valori delle sottochiavi usando la funzione GetKeyNames() ...

Se cerchi GetKeyNames su Google trovi abbastanza info direi Smile
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 15 Dic 2011 22:46    Oggetto: Rispondi citando

Ciao, grazie per l'aiuto

era esattamente ciò che mi seriva!

edit:
posso, gia che ci sono, appendere una seconda domanda inerente?

Molti programmi nella stringa DisplayName riportano anche il numero di versione, ad esempio:
PeaZip 4.2
LibreOffice 3.4
Mozilla Firefox 8.0.1 (x86 it)
MegaGlest v3.5.2

vorrei in qualche modo rimuovere il numero di versione dal nome, avere quindi in output:
PeaZip
LibreOffice
Mozilla Firefox
MegaGlest

da molti programmi basta togliere le cifre alla fine separate da uno spazio (es: peazip, LibreOffice), per altri anche le lettere attacate alla cifra alla fine (es: megaglest) e separati dal resto da uno spazio, mentre firefox è un casino visto che contiene anche le parentesti...

quindi in generale devo fare qualcosa tipo (togliendo firefox):
Codice:
se ultimo carattere è cifra
allora rimuovi tutto (cifra, punti, lettere)
finchè non trovi spazio

la rimozione va ovviamente effetuata all'indietro, come faccio però a controllare se l'ultimo carattere è una cifra?
Una variante includendo firefox potrebbe essere
Codice:

se ultimo carattere è parentesi chiusa (tonda, quadra, a graffe...)
 allora rimuovi tutto (cifra, punti, lettere)
finchè non trovi parentesi aperta
se ultimo carattere uguale a spazio rimuovi spazio
se ultimo carattere è cifra
 allora rimuovi tutto (cifra, punti, lettere)
finchè non trovi spazio

in questo modo tolgo prima la parentesi fino allo spazio, poi le cifre

potrebbe funzionare secondo voi?
forse dovrei aggiungere qualcosa come un controllo anche sugli spazi? e magari uno che controlli che la stringa rimanente non sia vuota...
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11566
Residenza: Tokelau

MessaggioInviato: 16 Dic 2011 10:21    Oggetto: Rispondi citando

potresti provare localizzando la posizione della prima cifra nella stringa, e poi facendo una ricerca per l'ultimo spazio precedente (minore) la posizione della prima cifra. Poi tagli tutto da questo ultimo spazio in poi...
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 16 Dic 2011 17:40    Oggetto: Rispondi

ok, grazie mille per i consigli Wink
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi