Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema al traducir a visual 2008

Estas en el tema de Problema al traducir a visual 2008 en el foro de .NET en Foros del Web. Saludos a todos. Estoy trabajando en una aplicación de escritorio escrita en visual basic con Visual Studio 2008. Concretamente necesito acceder al registro para recuperar ...
  #1 (permalink)  
Antiguo 16/11/2009, 05:52
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 7 meses
Puntos: 0
[SOLUCIONADO] Problema al traducir a visual 2008

Saludos a todos.

Estoy trabajando en una aplicación de escritorio escrita en visual basic con Visual Studio 2008. Concretamente necesito acceder al registro para recuperar informacion sobre aplicaciones instaladas tales como nombre, ruta de instalacion y toda la informacion que sea posible. He encontrado una API para el ADVAPI32.dll que en principio resolvería este asunto, pero esta escrito en Visual 6 o anterior (no sabria decirlo a ciencia cierta).

El caso es que esta casi todo traducido, sin embargo hay una linea de codigo de la que no consigo saber su funcion:

sValue = String(cch, 0)

Donde sValue es una variable tipo string y cch es una variable tipo long.

Logicamente visual Studio me da el siguiente error: " 'String' es un tipo de clase y no se puede utilizar como una expresión"

P.D. El codigo lo he cogido de esta pagina: support.microsoft.com/kb/145679

Última edición por albertobp; 02/12/2009 a las 09:52 Razón: El problema ha sido solucionado
  #2 (permalink)  
Antiguo 16/11/2009, 13:01
Avatar de eperedo  
Fecha de Ingreso: septiembre-2009
Ubicación: Perú
Mensajes: 654
Antigüedad: 14 años, 7 meses
Puntos: 16
Respuesta: Problema al traducir a visual 2008

Pero podrías explicar que hace la función String del vb6?? Creo que te armaba una cadena (primer parámetro) repetida "n" veces (segundo parámetro). (Corrígeme si no es eso).

No hay una equivalencia en la versión 9 de vb. Pero lo que podrías usar es lo siguiente:
Usa la función PadLeft
Código vb.net:
Ver original
  1. sValue = sValue.PadLeft(cch, 0)

__________________
Eduardo Peredo
Wigoin
  #3 (permalink)  
Antiguo 18/11/2009, 12:53
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema al traducir a visual 2008

Hola ya he resuelto ese problema. El proposito de sValue es crear un buffer de tamaño adecuado para leer una clave del registro. Este es el codigo que he puesto:
strBuf = New String(Chr(0), lDataBufSize)

El problema viene en la siguiente linea al hacer uso por segunda vez de la funcion RegQueryValue por segunda vez:

lResult = RegQueryValueEx(Keyhand, strValue, Nothing, Nothing, strBuf, _ lDataBufSize)

Aqui el problema es que me da este error: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Por lo que he observado, en ese punto lDataBufSize tiene valor 27 y si le paso a RegQueryValue un valor de lDataBufSize igual o superior a 27 me salta el error mencionado, sin embargo si es menor FUNCIONA pero la funcion devuelve el valor ERROR_MORE_DATA (234) indicando que ese valor es insuficiente para almacenar informacion en strBuf. Por mas vueltas que le doy no logro entender por que hace esto .
Mas informacion acerca de RegQueryValueEx: msdn.microsoft.com/en-us/library/ms724911%28VS.85%29.aspx

Este es el código con el que estoy trabajando (las lineas donde esta el problema estan marcadas con /*************/)
Código:
    ' Registry API prototypes
    'UPGRADE_ISSUE: No se admite la declaración de un parámetro 'As Any'. Haga clic aquí para obtener más información: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="FAE78A8D-8978-4FD4-8208-5B7324A8F795"'
    Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Integer, ByVal dwIndex As Integer, ByVal lpName As String, ByRef lpcbName As Integer, ByVal lpReserved As Integer, ByVal lpClass As String, ByRef lpcbClass As Integer, ByRef lpftLastWriteTime As Integer) As Integer
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Integer) As Integer
    Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Integer, ByVal lpSubKey As String, ByRef phkResult As Integer) As Integer
    Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Integer, ByVal lpSubKey As String) As Integer
    Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Integer, ByVal lpValueName As String) As Integer
    Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Integer, ByVal lpSubKey As String, ByRef phkResult As Integer) As Integer
    'UPGRADE_ISSUE: No se admite la declaración de un parámetro 'As Any'. Haga clic aquí para obtener más información: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="FAE78A8D-8978-4FD4-8208-5B7324A8F795"'
    
    Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Integer, ByVal lpValueName As String, ByVal Reserved As Integer, ByVal dwType As Integer, ByRef lpData As Integer, ByVal cbData As Integer) As Integer
    Public Const REG_SZ As Short = 1 ' Unicode nul terminated string
    Public Const REG_DWORD As Short = 4 ' 32-bit number
    Public sKeys As Collection

    

    Public Function GetString(ByRef hKey As Integer, ByRef strPath As String, ByRef strValue As String) As Object
        Dim lValueType As Integer
        Dim r As Object

        Dim Keyhand As Integer
        Dim datatype As Integer
        Dim lResult As Integer
        Dim strBuf As String
        Dim lDataBufSize As Integer
        Dim intZeroPos As Short        
        'UPGRADE_WARNING: No se puede resolver la propiedad predeterminada del objeto r. Haga clic aquí para obtener más información: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
        r = RegOpenKey(hKey, strPath, Keyhand)
        'ByVal hKey As Integer, ByVal lpSubKey As String, ByRef phkResult As Integer) As Integer
        'UPGRADE_WARNING: No se puede resolver la propiedad predeterminada del objeto lValueType. Haga clic aquí para obtener más información: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'

        lResult = RegQueryValueEx(Keyhand, strValue, 0, lValueType, Nothing, lDataBufSize)
        '(ByVal hKey As Integer, ByVal lpValueName As String, ByVal lpReserved As Integer, ByRef lpType As Integer, ByRef lpData As String, ByRef lpcbData As Integer) As Integer
        'UPGRADE_WARNING: No se puede resolver la propiedad predeterminada del objeto lValueType. Haga clic aquí para obtener más información: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
        If lValueType = REG_SZ Then
/*************/
            strBuf = New String(Chr(0), lDataBufSize)
            MsgBox(strBuf.Length)
            lResult = RegQueryValueEx(Keyhand, strValue, Nothing, Nothing, strBuf, 0)
/*************/

            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


    Public Function DeleteKey(ByVal hKey As Integer, ByVal StrKey As String) As Object
        Dim r As Integer
        r = RegDeleteKey(hKey, StrKey)

    End Function

    Public Sub GetKeyNames(ByVal hKey As Integer, ByVal strPath As String)
        Dim Cnt, TKey As Integer 'Cnt es un contador para acceder a la subclaves, empieza como 0 y se incrementa hasta que se llegue al final
        Dim StrBuff, StrKey As String
        RegOpenKey(hKey, strPath, TKey)
        Do
            StrBuff = New String(vbNullChar, 255) 'A pointer to a buffer that receives the name of the subkey, including the terminating null character
            'RegEnumKeyEx devuelve el valor ERROR_SUCCESS que equivale a 0 cuando tiene exito. Si falla devuelve un codigo de error
            If RegEnumKeyEx(TKey, Cnt, StrBuff, 255, 0, vbNullString, 0, 0) <> 0 Then Exit Do
            Cnt = Cnt + 1
            StrKey = Left(StrBuff, InStr(StrBuff, vbNullChar) - 1)
            sKeys.Add(StrKey)
        Loop
    End Sub

    Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
    String, ByVal vValue As Object) As Long
        Dim cch As Long
        Dim lrc As Long
        Dim lType As Long
        Dim lValue As Long
        Dim sValue As String

        On Error GoTo QueryValueExError

        ' Determine the size and type of data to be read
        lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
        If lrc <> ERROR_NONE Then Error 5

        Select Case lType
            ' For strings
            Case REG_SZ
                sValue = cch.ToString 'String(cch, 0)
                lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
                sValue, cch)
                If lrc = ERROR_NONE Then
                    vValue = Left$(sValue, cch - 1)
                Else
                    vValue = Nothing
                End If
                ' For DWORDS
            Case REG_DWORD
                lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
                lValue, cch)
                If lrc = ERROR_NONE Then vValue = lValue
            Case Else
                'all other data types not supported
                lrc = -1
        End Select

QueryValueExExit:
        QueryValueEx = lrc
        Exit Function

QueryValueExError:
        Resume QueryValueExExit

    End Function
End Module

'
  #4 (permalink)  
Antiguo 02/12/2009, 09:51
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 7 meses
Puntos: 0
[SOLUCIONADO] Respuesta: Problema al traducir a visual 2008

La aplicación en cuestión ya lee correctamente del registro, recupera toda la información que necesito y la presenta correctamente. He dejado la solución en este post:
forosdelweb.com/f79/tip-como-leer-datos-del-registro-vb-net-2008-a-758507
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:56.