RESPUESTA A LA PREGUNTA 1438 DE VISUAL BASIC El siguiente codigo lista en una caja de texto todas las conexiones ODBC de systema instaladas. Para obtener los ODBC de usuario hay que cambiar HKEY_LOCAL_MACHINE por HKEY_CURRENT_USER en el primer RegOpenKey() Const HKEY_CURRENT_USER = &H80000001 Const HKEY_LOCAL_MACHINE = &H80000002 Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName 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, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Sub LeerODBC() Dim hKeyK As Long Dim dwIndexK As Long Dim lpName As String Dim cbName As Long Dim hKeyV As Long Dim dwIndexV As Long Dim lvValueName As String Dim lpcbValueName As Long Dim lpReserved As Long Dim lpType As Long Dim lpData(255) As Byte Dim lpcbData As Long Dim lRet As Long Dim Clave As String Dim Valor As String Dim Dato As Variant Dim i As Long Text1.Text = "Lista ODBC de 32 bits" & vbCrLf & vbCrLf 'Abre el registro lRet = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI", hKeyK) dwIndexK = 0 Do cbName = 255 lpName = String(255, vbNullChar) 'Recorre las claves del registro RegEnumKey hKeyK, dwIndexK, lpName, cbName Clave = Left(lpName, InStr(1, lpName, vbNullChar) - 1) Text1.Text = Text1.Text & Clave Text1.Text = Text1.Text & vbCrLf lRet = RegOpenKey(hKeyK, Clave, hKeyV) dwIndexV = 0 Do lvValueName = String(255, vbNullChar) lpcbValueName = 255 lpcbData = 255 'Recorre los valores lRet = RegEnumValue(hKeyV, dwIndexV, lvValueName, lpcbValueName, lpReserved, lpType, lpData(0), lpcbData) Valor = Left(lvValueName, lpcbValueName) For i = 0 To lpcbData Dato = Dato & Chr(lpData(i)) Next Text1.Text = Text1.Text & vbTab & Valor & " = " & Dato Text1.Text = Text1.Text & vbCrLf dwIndexV = dwIndexV + 1 Loop Until Left(lvValueName, 1) = vbNullChar dwIndexK = dwIndexK + 1 Loop Until Left(lpName, 1) = vbNullChar End Sub Si ya sabemos de antemano que ODBC queremos leer tendriamos que usar la funcion del API 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 ' Note that if you declare the lpData parameter as String, you must pass it By Value. --------------------------------------------------------------------- Para leer del INI hay que usar las siguientes funciones del API Esta función devuelve la lista de entradas de una sección del INI Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Esta función devuelve el valor de una entrada en el INI Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Gabriel H. Arenovich Busquet garenovi@capgemini.es