Newsgroup: it.comp.java
Titolo: chiavi del registro di sistema

Ciao a tutti ho cercato nel web se ci fosse qualcosa che mi desse le
basi per lavorarci su, ma nulla di interessante ho trovato su come
accedere al registro di sistema.
Quello che voglio fare è entrare nel file di registro di win cercare
la presenza di un programma installato: se lo trovo, lo lancio
altrimenti, chiedo all'utente con un msg di andarlo a scaricare
presentandogli un link web.
Il materiale su java e chiavi di registro è inesistente o
probabilmente non sto cercando dove dovrei?
spero qualcuno possa tendere una mano grazie

 accedere al registro di sistema.
essendo java multipiattaforma, di base non troverai niente che sia 
'dipendente dal sistema' come il registro. Nello specifico, ci sono 
delle classi 'Preferences' nella 1.5 (se non sbaglio, o forse dalla 1.4) 
che ti permettono di gestire delle preferenze senza interessarti di dove 
si trovino (su win sul registro ecc.), ma immagino che questo non sia il 
tuo caso.
In alternativa, o ci sono delle librerie che interagiscono col sistema 
(mi pare ci fosse un progetto java desktop qualcosa, che forniva degli 
strumenti di interazione col sistema, ma non mi ricordo il nome esatto) 
oppure usi delle funzioni in altri linguaggi da java con JNI
bye
DKano

capisco che il gioco si fa duro e non so quanto possa esserlo io,
stavolta con java risultererà più difficile del consueto vediamo che
ne esce
ciao
DKano ha scritto:


 
Eventualmente puoi dare un'occhiata qui:
http://www.gjt.org/servlets/JCVSlet/list/ice/com/ice/jni/registry
Roba un po' vecchia pero'... non so se funge ancora, sorry.
In alternativa vedi su sourceforge:
http://sourceforge.net/search/?type_of_search=soft&exact=1&forum_id=0&group_id=0&atid=0&words=java+windows+registry&Search=Search
Ciao,
     Bruno
P.S.
Il JavaDay è qui!
http://www.javaday.it
-- 
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
| Coordinatore del JUG Torino - 
http://www.jugtorino.it

grazie per l'indicazione ci ho lavorato su un pò
ma ho ancora dei problemi:
riesco a navigare l'albero del registro fino a raggiungere il nodo che
mi interessa ma non riesco a leggere il valore delle chiavi:
sto usando questa classe:
****************************
package com;
import java.util.Enumeration;
import com.ice.jni.registry.*;
public class WrapperRegistryKey
{
	protected String keyData;
	public WrapperRegistryKey()
	{
		super();
	}
	public RegistryKey getRegistryKey(RegistryKey rootKey,
									String subKey, String key, String keyData)
	{
		this.keyData = keyData;
		RegistryKey rk = Registry.openSubkey(rootKey,subKey,
						RegistryKey.ACCESS_READ);
		return searchKey(rk,key);
	}
	public String getValueString(RegistryKey rk,String valueName)
	{
		String value = null;
		try
		{
			RegistryValue rv = rk.getValue(valueName);
			byte[] bytes = rv.getByteData();
			value = new String(bytes);
			if(value.substring(0,1).equals("\""))
				value = value.substring(1);
			int length = value.length();
			if(value.substring(length - 1,length).equals("\""))
				value = value.substring(0,length -1);
		}catch(NoSuchValueException nsve){
			System.out.println("NoSuchValueException: " + nsve.getMessage());
		}catch(RegistryException re){
			System.out.println("RegistryException: " + re.getMessage());
		}
		return value;
	}
	protected RegistryKey searchKey(RegistryKey rootKey, String key)
	{
		RegistryKey rk = null;
		try
		{
			for(Enumeration en = rootKey.keyElements();en.hasMoreElements();)
			{
				String curKey = (String)en.nextElement();
				//System.out.println("Registry sub key: " + curKey);
				if(!curKey.equals(key))
				{
					try
					{
						RegistryKey curRK = rootKey.openSubKey(curKey);
						rk = searchKey(curRK,key);
						if(rk != null)
							break;
					}catch(Exception ex){
						System.out.println("Recursive key search--" + curKey +
										": " + ex.getMessage());
					}
				}
				else
				{
					try
					{
						RegistryKey r = rootKey.openSubKey(key);
						if(keyData != null && !keyData.equals(key))
						{
							System.out.println("Chiave trovata per " + key);
							rk = searchKey(r,keyData);
							if(rk != null)
							{
								System.out.println("Chiave trovata " + rk + " per " + keyData);
								break;
							}
						}
						else
						{
							rk = r;
							break;
						}
					}catch(Exception ex){
						System.out.println("Recursive key search--" + curKey +
										": " + ex.getMessage());
					}
				}
			}
		}catch(RegistryException re){
			System.out.println("Search Key Exception: " + re.getMessage());
			rk = null;
		}
		return rk;
	}
}
***************************
che ho trovato in rete;
poi ho fatto una semplice classe per test:
***************************
package com;
import com.ice.jni.registry.*;
import java.util.Enumeration;
public class Prova
{
  public static void main(String args[]) throws RegistryException
  {
    RegistryValue v = null;
    WrapperRegistryKey wr= new WrapperRegistryKey();
    RegistryKey key =
wr.searchKey(Registry.HKEY_LOCAL_MACHINE,"ganttproject.exe");
    String prova  = key.getFullName();
    //System.out.println(prova);
    RegistryKey rk = wr.searchKey(key,"command");
    System.out.print(rk.getFullName());//scrive
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\ganttproject.exe\shell\open\command
    String prova2  = wr.getValueString(rk,rk.getFullName());//non
funziona
    System.out.println(prova2);
  }
}
*****************************
che mi permette di trovare sotto HKEY_LOCAL_MACHINE il software
installato di ganttProject
e poi vado a cercare il nodo "command" il cui valore
"C:\Programmi\GanttProject\ganttproject.exe" "%1"
ora io sono interessato a quest'ultimo come faccio a prendere il
percorso?
Qualcuno può indicarmi una via d'uscita in giro purtroppo la
documentazione e quasi inesistente
ciao e grazie

sono riuscito a leggere riporto la parte di codice che se ne preoccupa
se a qualcuno possa servire:
 try
    {//apro la chiave HKEY_CLASSES_ROOT\http\shell\open\command
     RegistryKey rkey =
Registry.HKEY_CLASSES_ROOT.openSubKey("http\\shell\\open\\command");
     WrapperRegistryKey wr= new WrapperRegistryKey();//creo un'istanza
della classe che avevo postato prima
     String value = wr.getValueString(rkey,"");
     System.out.print(value);//stampa C:\Programmi\Internet
Explorer\iexplore.exe" -nohome
    rkey.closeKey();//chiudo la chiave
     //String browserCommand = rkey.values().get("").toString();
    }
    catch(Exception e)
    {
      return;
    }
ciao grazie comunque
riccardo ha scritto:
