Título: Leet el registro de windows
Publicado por: noele1995 en 13 Marzo 2012, 17:25 pm
Hola en el proyecto actual que estoy haciendo estoy con el registro de windows, tengo algun que otro problemilla al leer los valores, cuando los valores son DWORD, no consigo leer su valor, les pongo el codigo: Public Function ValueData(Key As Long, strValueName As String, sType As Long) As String Dim lResult As Long, RetornoData As Long, strData As String, lngData As Currency, binData() As Byte, sTmp As String Dim i As Integer Select Case sType Case REG_NONE ValueData = vbNullString Case REG_SZ, REG_EXPAND_SZ, REG_LINK lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData) If lResult = 0 Then strData = String(RetornoData, Chr$(0)) lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal strData, RetornoData) If lResult = 0 Then ValueData = Left$(strData, InStr(1, strData, Chr$(0)) - 1) End If End If Case REG_MULTI_SZ lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData) If lResult = 0 Then strData = String(RetornoData, Chr$(0)) lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal strData, RetornoData) If lResult = 0 Then For i = Len(strData) To 1 Step -1 If Mid$(strData, i, 1) = Chr$(0) Then strData = Left$(strData, i - 1) Exit For End If Next For i = 1 To Len(strData) If Mid$(strData, i, 1) = Chr$(0) Then Mid$(strData, i, 1) = " " End If Next ValueData = Left$(strData, InStr(1, strData, Chr$(0)) - 1) End If End If For i = Len(strData) To 1 Step -1 If Mid$(strData, i, 1) = Chr$(0) Then strData = Left$(strData, i - 1) Exit For End If Next For i = 1 To Len(strData) If Mid$(strData, i, 1) = Chr$(0) Then Mid$(strData, i, 1) = " " End If Next Case REG_BINARY lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData) If lResult = 0 Then ReDim binData(RetornoData) lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, binData(0), RetornoData) If lResult = 0 Then For i = 0 To UBound(binData) - 1 sTmp = sTmp & Right$("00" & Hex$(binData(i)), 2) & " " Next ValueData = sTmp End If End If Case REG_DWORD, REG_DWORD_BIG_ENDIAN lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, lngData, RetornoData) If lResult = 0 Then ValueData = "0x" & Right$("00000000" & Hex$(lngData), 8) & " (" & lngData & ")" End If Case Else lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData) If lResult = 0 Then strData = String(RetornoData, Chr$(0)) lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal strData, RetornoData) If lResult = 0 Then ValueData = Left$(strData, InStr(1, strData, Chr$(0)) - 1) End If End If End Select End Function
A la funcion se la llama con la clave ya abierta, si pueden ayudarme se lo agradeceria. PD: ¿Como hacen para que el codigo salga con colores? Es menos lioso xD
Título: Re: Leet el registro de windows
Publicado por: $Edu$ en 14 Marzo 2012, 01:03 am
Encerra el codigo dentro de las etiquetas con el lenguaje correspondiente, por ejemplo en este caso con [code =vb] ' codigo [ /code] pero sin los espacios y veras que queda coloreado
Título: Re: Leet el registro de windows
Publicado por: noele1995 en 14 Marzo 2012, 15:32 pm
Ok eso responde a mi pregunta del color del codigo (no lo corrijo ahora porque con el movil tardo mucho ;D ), pero volviendo al tema de mi pregunta podriais ayudarme con los valores DWORD?
Título: Re: Leet el registro de windows
Publicado por: $Edu$ en 14 Marzo 2012, 15:44 pm
Yo no tengo ni idea, pero buscate en google como leer valores Dword, o sino capas que si buscas bien hasta encontras una forma de que lea todo.
Título: Re: Leet el registro de windows
Publicado por: burbu_1 en 15 Marzo 2012, 15:33 pm
En primer lugar tienes que asegurarte que el valor RetornoData es 4 o más grande, ya que para guardar un valor DWORD se necesitan 4 bytes, si no, RegQueryValueEx no te retornará ERROR_SUCCESS. Para los valores de cadena y binarios, ya haces esa comprobación llamando 2 veces al api, para los DWORD no hace falta poque SIEMPRE van a ser 4 bytes por otro lado, los valores DWORD son números de 32 bits (4bytes) SIN signo, mientras que los valores Long de vb, son números de 32 bits CON signo. Esto quiere decir que un valor WORD puede ir de 0 0x 00 00 00 00 a 4294967295 0x FF FF FF FF y un Long puede ir de 0 0x 00 00 00 00 a 2147483647 0x 07 FF FF FF y de -1 0x FF FF FF FF a -2147483648 0x 08 FF FF FF por lo que si el long es negativo, hay que hacer una conversión. Dim ValueData As String Dim hKey As Long If RegOpenKey(HKEY_CURRENT_USER, "kk", hKey) = ERROR_SUCCESS Then Dim lngData As Long 'un valor Long es un número de 4 bytes CON signo If RegQueryValueEx(hKey, "Nuevo", ByVal 0, ByVal 0, lngData, 4) = ERROR_SUCCESS Then If lngData < 0 Then 'Si el long es negativo se pasa a DWORD (por ejemplo asi) ValueData = "0x" & Right$("00000000" & Hex$(lngData), 8) & " (" & (2 * 2147483648#) + lngData & ")" Else ValueData = "0x" & Right$("00000000" & Hex$(lngData), 8) & " (" & lngData & ")" End If End If RegCloseKey hKey End If
Saludos.
Título: Re: Leet el registro de windows
Publicado por: noele1995 en 16 Marzo 2012, 00:15 am
Muchas gracias me has aclarado mucho, muy bien explicado tambien. Mañana mismo corregire el codigo. Gracias de nuevo burbu_1 ;D
|