** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Migracion Access:2010_Acces_2016
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoMigracion Access:2010_Acces_2016

 Responder Responder
Autor
Mensaje
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Tema: Migracion Access:2010_Acces_2016
    Enviado: 05/Febrero/2025 a las 10:11
Buenos dias Me estoy planteando pasar algunas aplicaciones desde access(32 bits) a Acces_2106(64 bits). Mis dudas son varias, pero las ire planteando una a una. La de hoy es saber si access_2016 actualiza automaticamente las Apis de 32 a Apis de 64 y si pueden convivir las dos para que las aplicaciones sean compatibles con aquellos que aun siguen trabajando con acces_2010 de 32 bits (como es mi caso). 
Todo esto lo puedo hacer automaticamente desde access_2016 ? o tendré que tirar manualmente de #If...#Else...#End If para modificar los PtrSafe y argumentos de cada API. Por si acaso me estoy creando un procedimiento que lo consiga.


Editado por main - 05/Febrero/2025 a las 10:13
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 10:15
La actualización no es automática.

Si diseñas con #If ... #Else  ... #End If  la aplicación se podrá ejecutar en 32 ó 64 bits indistintamente.

Todo es cuestión de acostumbrarse.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 10:19
Hay disponible alguna herramienta gratuita que reconstruya las apis de todos los modulos?.
Si no la hay publicare mi trabajo( hecho hasta ahora) aunque da varios errores y entre todos lo podamos aplicar. Que sea con #IF para dejarlo compatible


Editado por main - 05/Febrero/2025 a las 10:21
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 10:30
No la conozco (seguro que algo habrá).
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 14:07
Buenas de nuevo si Mihura no lo conoce me temo que será muy dificil encontrarla asi que voy a empezar por algo que parece que funciona pero no del todo y es un pequeño procedimiento dentro de un modulo que se ejecuta con solo pulsar "F5". No es para hacerlo compatible con 32 bits, solo las transforma a 64bits. Hacer copias de seguridad si la quereis probar antes de liarla. Como supongo que a más de uno le picará la curiosidad tras el procedimiento pongo algunas que no me las construye.
' Procedimiento para convertir declaraciones de API a 64 bits en VBA
Sub ConvertirAPIsVBA64()
    Dim vbProj As Object
    Dim vbComp As Object
    Dim vbMod As Object
    Dim Linea As String
    Dim i As Long
    Dim NuevaLinea As String
    Dim codigo As String
    
    ' Accede al proyecto VBA
    Set vbProj = Application.VBE.ActiveVBProject
    
    ' Recorre todos los módulos
    For Each vbComp In vbProj.VBComponents
        ' Solo procesa módulos estándar y de clase
        If vbComp.Type = 1 Or vbComp.Type = 2 Then
            Set vbMod = vbComp.CodeModule
            codigo = vbMod.Lines(1, vbMod.CountOfLines)
            
            ' Recorre cada línea buscando declaraciones de API
            For i = 1 To vbMod.CountOfLines
                Linea = vbMod.Lines(i, 1)
                
                ' Si la línea contiene "Declare PtrSafe" y "Lib", procesarla
                If InStr(1, Linea, "Declare", vbTextCompare) > 0 And _
                   InStr(1, Linea, "Lib", vbTextCompare) > 0 Then
                    
                    ' Asegurar compatibilidad con VBA7
                    If Not InStr(1, Linea, "PtrSafe", vbTextCompare) > 0 Then
                        NuevaLinea = Replace(Linea, "Declare", "Declare PtrSafe")
                    Else
                        NuevaLinea = Linea
                    End If
                    
                    ' Reemplazar Long por LongPtr solo en punteros
                    NuevaLinea = Replace(NuevaLinea, "ByVal Hwnd As Long", "ByVal Hwnd As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lp As Long", "ByVal lp As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "ByVal wFormat As Long", "ByVal wFormat As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "As Boolean", "As Long") ' Boolean no es válido en API 64-bit
                    
                    ' Evitar reemplazo incorrecto en variables que no son punteros
                    NuevaLinea = Replace(NuevaLinea, "ByVal bAlpha As Long", "ByVal bAlpha As Byte")
                    
                    ' Actualizar la línea en el código
                    codigo = Replace(codigo, Linea, NuevaLinea)
                End If
            Next i
            
            ' Reemplazar código en el módulo
            vbMod.DeleteLines 1, vbMod.CountOfLines
            vbMod.InsertLines 1, codigo
        End If
    Next vbComp
    
    MsgBox "Conversión de API a 64 bits completada", vbInformation
End Sub

Y estos son algunos ejemplos que no me convierte, si alguno sabe porqué podría subsanarlo y todos contentos.
Public Declare Function DrawMenuBar _
                Lib "user32" _
                (ByVal Hwnd As Long) As Long

Private Declare Function InternetCheckConnection _
 Lib "wininet.dll" Alias "InternetCheckConnectionA" _
 (ByVal lpszUrl As String, ByVal dwFlags As Long, _
 ByVal dwReserved As Long) As Long

Private Declare Function InternetOpen _
 Lib "wininet.dll" Alias "InternetOpenW" _
 (ByVal lpszAgent As Long, _
 ByVal dwAccessType As Long, _
 ByVal lpszProxyName As Long, _
 ByVal lpszProxyBypass As Long, _
 ByVal dwFlags As Long) As Long

Private Declare Function InternetOpenUrl _
 Lib "wininet.dll" Alias "InternetOpenUrlW" _
 (ByVal hInet As Long, _
 ByVal lpszUrl As Long, _
 ByVal lpszHeaders As Long, _
 ByVal dwHeadersLength As Long, _
 ByVal dwFlags As Long, _
 ByVal dwContext As Long) As Long

Private Declare Function InternetCloseHandle _
 Lib "wininet.dll" (ByVal hInet As Long) As Long

Public Declare Function GetSystemMetrics _
       Lib "user32" (ByVal nIndex As Long) As Long

Public Declare Function apiIsWindowEnabled _
       Lib "user32" _
       Alias "IsWindowEnabled" _
      (ByVal Hwnd As Long) As Long
                    
Public Declare Function apiGetWindowRect _
       Lib "user32" _
       Alias "GetWindowRect" _
       (ByVal Hwnd As Long, _
       lpRect As Rect) As Long






Editado por main - 05/Febrero/2025 a las 14:11
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 15:15
No quiero ser aguafiestas, pero, hay variables Long que no se sustituyen por LongPtr al cambiar de 32 a 64 bits.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 18:59
Vale que no seas agua fiestas pero si quieres colaborar,aporta
Si quieres



Editado por main - 05/Febrero/2025 a las 19:00
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 19:04
Se trata de corregir el procedimiento, solo eso
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 19:06
y sino se puede cerra,por mi parte el hilo
saludos
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 05/Febrero/2025 a las 19:17
Yo lo hago a mano, usando la información de equivalencia entre uno y otro.

https://www.microsoft.com/en-us/download/details.aspx?id=9970
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 06/Febrero/2025 a las 10:58
Gracias Mihura por el detalle de los LongPtr
Hechos cambios quedaria asi:
Sub ConvertirAPIsVBA64()
    Dim vbProj As Object
    Dim vbComp As Object
    Dim vbMod As Object
    Dim Linea As String
    Dim i As Long
    Dim NuevaLinea As String
    Dim codigo As String
    
    ' Accede al proyecto VBA
    Set vbProj = Application.VBE.ActiveVBProject
    
    ' Recorre todos los módulos
    For Each vbComp In vbProj.VBComponents
        ' Solo procesa módulos estándar y de clase
        If vbComp.Type = 1 Or vbComp.Type = 2 Then
            Set vbMod = vbComp.CodeModule
            codigo = vbMod.Lines(1, vbMod.CountOfLines)
            
            ' Recorre cada línea buscando declaraciones de API
            For i = 1 To vbMod.CountOfLines
                Linea = vbMod.Lines(i, 1)
                
                ' Si la línea contiene "Declare PtrSafe" y "Lib", procesarla
                If InStr(1, Linea, "Declare", vbTextCompare) > 0 And _
                   InStr(1, Linea, "Lib", vbTextCompare) > 0 Then
                    
                    ' Asegurar compatibilidad con VBA7
                    If InStr(1, Linea, "PtrSafe", vbTextCompare) = 0 Then
                        NuevaLinea = Replace(Linea, "Declare", "Declare PtrSafe")
                    Else
                        NuevaLinea = Linea
                    End If
                    
                    ' Reemplazar Long por LongPtr en punteros y handles
                    NuevaLinea = Replace(NuevaLinea, "ByVal Hwnd As Long", "ByVal Hwnd As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "ByVal hInet As Long", "ByVal hInet As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lp As Long", "ByVal lp As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lpszAgent As Long", "ByVal lpszAgent As String")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lpszUrl As Long", "ByVal lpszUrl As String")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lpszProxyName As Long", "ByVal lpszProxyName As String")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lpszProxyBypass As Long", "ByVal lpszProxyBypass As String")
                    NuevaLinea = Replace(NuevaLinea, "ByVal lpRect As Rect", "ByRef lpRect As Rect")
                    
                    ' Reemplazar Boolean por Long para evitar errores en 64 bits
                    NuevaLinea = Replace(NuevaLinea, "As Boolean", "As Long")
                    
                    ' Evitar reemplazo incorrecto en variables que no son punteros
                    NuevaLinea = Replace(NuevaLinea, "ByVal bAlpha As Long", "ByVal bAlpha As Byte")
                    
                    ' Corrección para funciones de memoria GlobalAlloc, GlobalFree, etc.
                    NuevaLinea = Replace(NuevaLinea, "Declare Function GlobalAlloc Lib " & Chr(34) & "kernel32" & Chr(34), "Declare PtrSafe Function GlobalAlloc Lib " & Chr(34) & "kernel32" & Chr(34) & " (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "Declare Function GlobalFree Lib " & Chr(34) & "kernel32" & Chr(34), "Declare PtrSafe Function GlobalFree Lib " & Chr(34) & "kernel32" & Chr(34) & " (ByVal hMem As LongPtr) As Long")
                    NuevaLinea = Replace(NuevaLinea, "Declare Function GlobalLock Lib " & Chr(34) & "kernel32" & Chr(34), "Declare PtrSafe Function GlobalLock Lib " & Chr(34) & "kernel32" & Chr(34) & " (ByVal hMem As LongPtr) As LongPtr")
                    NuevaLinea = Replace(NuevaLinea, "Declare Function GlobalUnlock Lib " & Chr(34) & "kernel32" & Chr(34), "Declare PtrSafe Function GlobalUnlock Lib " & Chr(34) & "kernel32" & Chr(34) & " (ByVal hMem As LongPtr) As Long")
                    
                    ' Asegurar que la librería esté entre comillas
                    NuevaLinea = Replace(NuevaLinea, "Lib kernel32", "Lib " & Chr(34) & "kernel32" & Chr(34))
                    NuevaLinea = Replace(NuevaLinea, "Lib user32", "Lib " & Chr(34) & "user32" & Chr(34))
                    NuevaLinea = Replace(NuevaLinea, "Lib wininet", "Lib " & Chr(34) & "wininet" & Chr(34))
                    
                    ' Actualizar la línea en el código
                    codigo = Replace(codigo, Linea, NuevaLinea)
                End If
            Next i
            
            ' Reemplazar código en el módulo
            vbMod.DeleteLines 1, vbMod.CountOfLines
            vbMod.InsertLines 1, codigo
        End If
    Next vbComp
    
    MsgBox "Conversión de API a 64 bits completada", vbInformation
End Sub



Y confío en que al menos sigas siendo aguafiestas para mejorarla. Y que alguno colabora con la versión #If ... #Else ... #end If
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1301
Enlace directo a este mensaje Enviado: 10/Febrero/2025 a las 14:41
Este hilo se puede cerrar
Saludos al grupo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable