Newsgroup: it.comp.lang.visual-basic
Titolo: [API] Maledette API

Cari Amici, come sapete, sono costantemente impegnato nello studio e
nell'approfondimento delle API.
Bene mi sono imbattuto nelle API del registro.
Il mio scopo è capire come leggere il contenuto di una sottochiave.
Credo che mi sto incasinando nel passaggio delle variabili come Long.
String, o Any.
Ad es. mettiamo che voglio legere dal registro il tipo di risoluzione dello
schermo.
Io scrivo (dopo aver aperto la chiave con l'API   RegOpenKey
'Nel Modulo
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
Public Const ERROR_SUCCESS = 0&
Public Const APINULL = 0&
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public ReturnCode As Long
'Codice:
Dim hKey As Long
Dim lpSubKey As String
Dim phkResult As Long
Dim lpValueName As String
Dim lpReserved As Long
Dim lpType As Long
Dim lpData As Long
Dim lpcbData As Long
lpSubKey = "Config\0001\Display\Settings"
ReturnCode = RegOpenKey(HKEY_LOCAL_MACHINE, lpSubKey, _
phkResult)
If ReturnCode = ERROR_SUCCESS Then
    hKey = phkResult
lpValueName = "Resolution"
lpReserved = APINULL
    lpType = APINULL
    lpData = APINULL
    lpcbData = APINULL
    ReturnCode = RegQueryValueEx(hKey, lpValueName, _
    lpReserved, lpType, ByVal lpData, lpcbData)
    ReturnCode = RegQueryValueEx(hKey, lpValueName, _
    lpReserved, lpType, lpData, lpcbData)
    lpcbData = Len(lpData)
    Print "lpData "
RegCloseKey (hKey)
End If
OK, lpData, contiene il n° 741356598 io invece mi asppetterei di trovare la
stessa stringa che leggo utilizzando il Regedit e cioè "640,480"
--
Posted from 
romeo.logikos.it
 [193.70.26.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

"Cesare Rizzi" ha scritto nel messaggio
<000001bf41b9$90195e00$6be1d8d4@default>...

Premesso che per leggere la risoluzione e n° colori dello schermo dovresti
usare la GetDeviceCaps().
Questa è la routine, della classe per la gestione del registry che mi sono
scritto io, per la lettura di una chiave stringa.
Intanto ho utilizzato RegOpenKeyEx() e non RegOpenKey(), poi nella
dichiarazione di RegQueryValueEx() lpData l'ho messa come ByVal lpData as
String.
Non ricordo se è stata fatta intenzionalmente, ma credo che VB con gli Any
faccia un po' di confusione tra valori e puntatori.
Ecco la funzione debitamente commentata
Public Property Get KeyValue(ByVal KeyName As String) As String
    Dim lpReturn As String 'valore di ritorno della chiave
    Dim lpLen As Long 'lunghezza di lpReturn
    Dim hOpenKey As Long 'handle della chiave
'*** IMPORTANTE ***
' la riga seguente è necessaria al corretto funzionamento di molte api che
restituiscono stringhe.
' Era così anche con le Api per i files ini
' Inizializzo la stringa per la massima lunghezza di ritorno
    lpReturn = String$(DEF_MAX_KEYLEN, 0)
    'apro la chiave: p_Section è un retaggio della classe per i files ini
    Call RegOpenKeyEx(p_RootKey, p_Section, 0&, KEY_READ, hOpenKey)
    'Chiedo il valore KeyName come stringa (REG_SZ) ed ottengo anche la sua
lunghezza
    Call RegQueryValueEx(hOpenKey, KeyName, 0&, REG_SZ, lpReturn, lpLen)
    If (lpLen > 0) Then
        'non so perchè ma a volte non riesce a leggere le chiavi appena
scritte
        'e che sono quindi ancora nella cache. Basta fare un flush e
riprovare.
        If (InStr(lpReturn, Chr$(0)) = 1) Then
            RegFlushKey (hOpenKey)
            Call RegQueryValueEx(hOpenKey, KeyName, 0&, REG_SZ, lpReturn,
lpLen)
            KeyValue = Left$(lpReturn, lpLen - 1) 'accorcio lpReturn alla
giusta taglia
        End If
    Else
        ' la chiave e/o il valore non esistono
        KeyValue = vbNullString
    End If
    ' chiudo la chiave
    Call RegCloseKey(hOpenKey)
End Property
Nota che questa funzione è stata scritta esclusivamente per valori stringa.
DEF_MAX_KEYLEN l'ho definita io come
Const DEF_MAX_KEYLEN = &HFF '255
Ciao