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
|
|