Newsgroup: it.comp.appl.access
Titolo: Scrivere nel registro (per Claudio Costarella)

Ciao Carlo,
in un post del 20/04/05 scrivevi questo codice:
Option Compare Database
Option Explicit
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const ERROR_SUCCESS = 0&
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal Hkey As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA"
(ByVal Hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA"
(ByVal Hkey As Long, ByVal lpSubKey As String) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA"
(ByVal Hkey As Long, ByVal lpValueName As String) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal
Hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA"
(ByVal Hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long,
lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA"
(ByVal Hkey As Long, ByVal lpValueName As String, ByVal Reserved As Long,
ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Public Const REG_SZ = 1
Public Const REG_DWORD = 4
Public Sub savekey(Hkey As Long, strPath As String)
Dim keyhand&
r = RegCreateKey(Hkey, strPath, keyhand&)
r = RegCloseKey(keyhand&)
End Sub
Public Sub savestring(Hkey As Long, strPath As String, strValue As String,
strdata As String)
Dim keyhand As Long
Dim r As Long
r = RegCreateKey(Hkey, strPath, keyhand)
r = RegSetValueEx(keyhand, strValue, 0, REG_SZ, ByVal strdata, Len(strdata))
r = RegCloseKey(keyhand)
End Sub
Public Function getstring(Hkey As Long, strPath As String, strValue As
String)
Dim keyhand As Long
Dim datatype As Long
Dim lResult As Long
Dim strBuf As String
Dim lDataBufSize As Long
Dim intZeroPos As Integer
r = RegOpenKey(Hkey, strPath, keyhand)
lResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&,
lDataBufSize)
If lValueType = REG_SZ Then
    strBuf = String(lDataBufSize, " ")
    lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf,
lDataBufSize)
    If lResult = ERROR_SUCCESS Then
        intZeroPos = InStr(strBuf, Chr$(0))
        If intZeroPos > 0 Then
            getstring = Left$(strBuf, intZeroPos - 1)
        Else
            getstring = strBuf
        End If
    End If
End If
End Function
Tipicamente per scrivere:
Private Sub TuoPulsante_Click()
Call savestring(HKEY_CURRENT_USER, "Software\TUACHIAVE\Registry", "String",
"TuaStringaDaScrivere")
End Sub
Tipicamente per leggere:
Private Sub TuoPulsanteGetString_Click()
Dim strString As String
strString = getstring(HKEY_CURRENT_USER, "Software\TUACHIAVE\Registry",
"String")
MsgBox strString
End Sub
se ho bel capito la MsgBox dovrebbe riportare "TuaStringaDaScrivere", mentre
mi appare vuota.
dove sbaglio?
Grazie
Giuseppe

 Giuseppe
Ciao Giuseppe
io mi chiamo Carlo...ma va bene lo stesso.
Ti faccio un esempio per leggere un valore seguendo il codice riportato:
supponiamo che tu voglia leggere cosa c'è scritto in "doc" alla chiave
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Extensions
scriverai
strString = getstring(HKEY_CURRENT_USER, 
"Software\Microsoft\Windows\CurrentVersion\Extensions","doc")
Il risultato sarà qualcosa del genere:
C:\PROGRA~1\MIF269~1\OFFICE11\WINWORD.EXE ^.doc
Allo stesso modo se vuoi scrivere qualcosa.
Apri il registro fino a trovare la chiave che ti ho appena scritto e, credo, 
capirai da solo.
In ultimo ti ricordo che il codice legge valori di tipo stringa perchè serve 
a scrivere valori di tipo stringa.
Ciao, Carlo 

 ha scritto nel messaggio
news:44abaae9$0$5099$4faf...@reader2.news.tin.it...

Ciao CARLO, scusa per l'errore e grazie,
in effetti facevo così, ma mi restituisce la Msgbox vuota...
mi dà anche il messaggio "errore di compilazione: variabile non definita"
 per "r" e "lValueType" nella funzione "getstring".
li ho considerati entrambi Long.
grazie ancora
Giuseppe

Cut
ti rimando l'intero modulo con le correzioni:




Dim r As Long
r = RegCreateKey(Hkey, strPath, keyhand&)
r = RegCloseKey(keyhand&)
End Sub
Public Sub savestring(Hkey As Long, strPath As String, strValue As String, 
strdata As String)
Dim keyhand As Long
Dim r As Long
r = RegCreateKey(Hkey, strPath, keyhand)
r = RegSetValueEx(keyhand, strValue, 0, REG_SZ, ByVal strdata, Len(strdata))
r = RegCloseKey(keyhand)
End Sub
Public Function getstring(Hkey As Long, strPath As String, strValue As 
String)
Dim keyhand As Long
Dim datatype As Long
Dim lResult As Long
Dim strBuf As String
Dim lDataBufSize As Long
Dim intZeroPos As Integer
Dim r As Long
Dim lValueType
r = RegOpenKey(Hkey, strPath, keyhand)
lResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&, 
lDataBufSize)
If lValueType = REG_SZ Then
    strBuf = String(lDataBufSize, " ")
    lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf, 
lDataBufSize)
    If lResult = ERROR_SUCCESS Then
        intZeroPos = InStr(strBuf, Chr$(0))
        If intZeroPos > 0 Then
            getstring = Left$(strBuf, intZeroPos - 1)
        Else
            getstring = strBuf
        End If
    End If
End If
End Function
'Tipicamente per scrivere:
Private Sub TuoPulsante_Click()
Call savestring(HKEY_CURRENT_USER, "Software\TUACHIAVE\Registry", "String", 
"TuaStringaDaScrivere")
End Sub
'Tipicamente per leggere:
Private Sub TuoPulsanteGetString_Click()
Dim strString As String
strString = getstring(HKEY_CURRENT_USER, "Software\AvantGo\Home", "String")
MsgBox strString
End Sub
Ciao, Carlo 


Come si chiama la chiave? Se usi regedit riporta la chiave completa di 
sinistra e poi, a parte, la chiave di destra.
E' di tipo testo? Hai provato se legge altre chiavi?
Ciao, Carlo 

 ha scritto nel messaggio
news:44ac9619$0$16928$4faf...@reader4.news.tin.it...

Ciao,
La chiave che ho scritto è una di prova e ho utilizzato quella del tuo
esempio: HKEY_CURRENT_USER, "Software\TUACHIAVE\Registry", "String",
"TuaStringaDaScrivere"; la scrive ma non la legge (o comunque la Msgbox è
vuota).
Ho provato con altre chiavi ma il risultato è lo stesso.
Grazie
Giuseppe


Mi sà che fai qualche errore...
Prova a scrivere nella finestra di debug o nella finestra immediata
?getstring(HKEY_LOCAL_MACHINE, 
"SOFTWARE\Microsoft\Windows\CurrentVersion","CommonFilesDir")
dai invio e dimmi se ti compare qualcosa.
Hai accesso come amministratore?
Ciao, Carlo 

 ha scritto nel messaggio
news:44ace868$0$10058$4faf...@reader3.news.tin.it...

Ciao,
sì ho accesso come amministratore.
Ho scritto il codice nella finestra immediata, ho dato invio ma non è
successo niente.
Grazie
Giuseppe

 Giuseppe
A me funziona benissimo.
Ne deduco che ci deve essere qualche errore nella routine.
Togli tutti gli on error resume next.
Imposta le funzioni come public e le declare come public.
Mettiti nel modulo e dalla finestra immediata riprova a digitare 
l'istruzione che ti ho mandato.
Che sistema operativo usi? Quale versione di Access?
Di piů non sň...
Ciao, Carlo

 ha scritto nel messaggio 
news:44ae8e64$0$5085$4faf...@reader2.news.tin.it...

Ciao Carlo,
scusa il ritardo ma non potevo accedere ad internet, ho fatto come mi hai 
detto, ho copiato il codice che mi hai mandato nella finestra immendiata ho 
dato invio ma non succede niente.
Evidentemente ho un problema, faccio qualche fesseria ma non sň quale, il 
bello che con il tuto codice sul registro ci scrivo tranquillamente.
Ci scrivo e ci leggo anche con savesetting e getsetting.
Uso Win XP e Access 2003.
Ciao e grazie


Mandami il pc a casa!
Ciao, Carlo 

 ha scritto nel messaggio 
news:44b2792c$0$10059$4faf...@reader3.news.tin.it...

Non mi fido! E se poi me lo rovini?? :-))
Grazie comunque
Ciao
Giuseppe 

 Giuseppe
:-))
:-))
:-))
Ciao, Carlo