Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Lettura chiavi del registro sotto Windows XP

Ovviamente si parla di lettura delle chiavi da programma.
Quando il programma gira sotto windows98 o Me va tutto bene, sotto windows
Xp invece non funzia.
Ho pensato allora a problemi con i permessi, visto che Xp come sistema
multiutente mette la sicurezza davanti a tutto.
Francamente il porting sotto Xp mi pare molto fastidioso.
Non capisco ad esempio per quale oscura ragione non ci sia verso di far
funzionare l'api CreatePipe(), operazione necessaria per redirezionare
l'output delle utility dos.
E' poco sicuro redirezionare l'output?
Boh comunque quello l'ho risolto rinunciando a redirezionare l'output e
usando un sistema spocchioso che se qualcosa va male blocca davvero tutto.
Comunque e' un ben modesto prezzo da pagare: la sicurezza e' tutto di questi
tempi.
Ma il problema vero e' un altro: la consultazione delle chiavi di registro,
piu' esattamente della subkey "Software\Microsoft\Windows\CurrentVersion\App
Paths\" nella chiave HKEY_LOCAL_MACHINE
Mi serve per trovare il percorso completo di un eseguibile (correttamente
installato) passando solo il nome dell'eseguibile.
Mi chiedo se sia un problema di privilegi d'accesso ma mi pare strano
perche' anche provando ad aprire la chiave RegOpenKeyEx (nel listato qua
sotto c'e' l'altra versione ma il risultato non cambiava) con l'accesso
Key_query_value mi restituiva l'handle senza errori e penso che se non ho
l'accesso per consultare i valori di quella chiave l'errore sarebbe dovuto
essere gia' con RegOpenKeyEx.
L'errore invece mi arriva alla prima chiamata della funzione RegEnumValue()
ed ha come valore 87 che mi risulta coincidere con "parametro invalido" che
non c'entra molto con i privilegi d'accesso.
Questo e' il codice:
'dichiarazioni
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
        ByVal hKey As Long, ByVal lpSubKey As String, phkResult As  Long) As
Long
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" _
 (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName  As _
        String, lpcbValueName As Long, lpReserved As Long, lpType As Long, _
        ByVal lpData As String, lpcbData As Long) As Long
'chiamata della funzione
dim Percorso as String
Percorso =  LeggiValoreKey("Software\Microsoft\Windows\CurrentVersion\App
Paths\winroomedit.exe")
'funzione lettura chiave
Public Function LeggiValoreKey(NomeChiave As String) As String
'restituisce il primo  valore di chiave NomeChiave
'o "" se errore
Dim hKey As Long
Dim NomeValore As String * 512
Dim BufDati As String * 512
Dim SizeNomeValore As Long
Dim SizeBufDati As Long
Dim TipoDati As Long
Dim RetVal As Long, i As Long
Dim NuovoHandle As Long
Dim Testo As String
Dim NDati As Long, Valore As String
hKey = HKEY_LOCAL_MACHINE
RetVal = RegOpenKey(hKey, NomeChiave, NuovoHandle)
If (RetVal <> ERROR_SUCCESS) Then
    LeggiValoreKey = ""
    Exit Function
End If
SizeNomeValore = Len(NomeValore) - 1
SizeBufDati = 510
RetVal = RegEnumValue(NuovoHandle, 0, NomeValore, SizeNomeValore, _
        vbNull, TipoDati, BufDati, SizeBufDati)
If (RetVal <> ERROR_SUCCESS) Then
    Testo = ""
    Exit Function
End If
'copia stringa fino a zero finale
Testo = ""
For i = 1 To Len(BufDati)
    Valore = Mid(BufDati, i, 1)
    If (Valore = Chr(0)) Then Exit For
    Testo = Testo & Valore
Next i
LeggiValoreKey = Testo
End Function

         ByVal lpData As String, lpcbData As Long) As Long
Da 
www.allapi.net
 (API-Guide) la dichiarazione del tipo č diversa nel
penultimo parametro (vedi, di conseguenza, la tipologia degli argomenti
passati):
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA"
(ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String,
lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As
Byte, lpcbData As Long) As Long


Grazie ora provo a vedere se cosi' funziona.
Resta il mistero del perche' quella definizione funzionava su Windows98/me.

End If
Vedrai che adesso funziona ;-)
-- 
ciao, hal