Imprimir página | Cerrar ventana

Migracion Access:2010_Acces_2016

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=87034
Fecha de impresión: 26/Marzo/2026 a las 15:29


Tema: Migracion Access:2010_Acces_2016
Publicado por: main
Asunto: Migracion Access:2010_Acces_2016
Fecha de publicación: 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.



Respuestas:
Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 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


Publicado por: Mihura
Fecha de publicación: 05/Febrero/2025 a las 10:30
No la conozco (seguro que algo habrá).

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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 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






Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 05/Febrero/2025 a las 18:59
Vale que no seas agua fiestas pero si quieres colaborar,aporta
Si quieres



Publicado por: main
Fecha de publicación: 05/Febrero/2025 a las 19:04
Se trata de corregir el procedimiento, solo eso


Publicado por: main
Fecha de publicación: 05/Febrero/2025 a las 19:06
y sino se puede cerra,por mi parte el hilo
saludos


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 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


Publicado por: main
Fecha de publicación: 10/Febrero/2025 a las 14:41
Este hilo se puede cerrar
Saludos al grupo



Imprimir página | Cerrar ventana