|
Responder
|
| Autor | |
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
Tema: Migracion Access:2010_Acces_2016Enviado: 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 |
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: en línea Puntos: 14428 |
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. |
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
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 |
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: en línea Puntos: 14428 |
Enviado: 05/Febrero/2025 a las 10:30 |
|
No la conozco (seguro que algo habrá).
|
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
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 |
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: en línea Puntos: 14428 |
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.
|
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
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 |
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
Enviado: 05/Febrero/2025 a las 19:04 |
|
Se trata de corregir el procedimiento, solo eso
|
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
Enviado: 05/Febrero/2025 a las 19:06 |
|
y sino se puede cerra,por mi parte el hilo saludos
|
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: en línea Puntos: 14428 |
Enviado: 05/Febrero/2025 a las 19:17 |
|
Yo lo hago a mano, usando la información de equivalencia entre uno y otro. |
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
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
|
|
![]() |
|
main
Colaborador
Unido: 31/Agosto/2009 Localización: OVIEDO Estado: Sin conexión Puntos: 1301 |
Enviado: 10/Febrero/2025 a las 14:41 |
|
Este hilo se puede cerrar
Saludos al grupo
|
|
![]() |
|
Responder
|
|
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |