** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Modificar código 32 bits para 64 bits
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Modificar código 32 bits para 64 bits

 Responder Responder
Autor
Mensaje
eru Ver desplegable
Nuevo
Nuevo


Unido: 13/Octubre/2021
Localización: España
Estado: Sin conexión
Puntos: 7
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita eru Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Modificar código 32 bits para 64 bits
    Enviado: 13/Octubre/2021 a las 18:47
Hola.
He abierto con Access de 64 bits un archivo cuyo código estaba creado para 32 bits. Recibo un mensaje advirtiendo del hecho:
“Error de compilación: El código de este proyecto se debe actualizar para usarse en sistemas de 64 bits. Revise y actualice las instrucciones Declare y, a continuación, márquelas con el atributo PtrSafe”
He hecho lo que dice y ya no me sale el aviso en cuestión. Sin embargo, el ejecutar el código asociado a un botón, recibo el mensaje: “Argumento no válido”.
Comparto el archivo .mdb. Es el original para 32 bits.
No es una aplicación mía, es una herramienta de integración de datos de lectores a AbiesWeb, realizado por Francisca García Bernal, y con licencia Creative Commons Reconocimiento-NoComercial-Compartirigual 4.0 Internacional License.
He realizado algunas pruebas orientado por Jesús Mihura, pero sigo atascado.
Por un lado, he consultado en la web (Compatibility Between the 32-bit and 64-bit Versions of Office 2010 | Microsoft Docs) y, al hacer algunas modificaciones ya no me daba ningún error de compilación, pero sí el de "Argumento no válido".
Posteriormente, incorporé el siguiente código:

#If Win64 Then
Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Type OPENFILENAME
lStructSize As Long
hwndOwner As LongPtr
hInstance As LongPtr
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
pvReserved As LongPtr
dwReserved As Long
FlagsEx As Long
End Type
#Else
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
#End If


El nuevo error que recibo es:
https://drive.google.com/file/d/1D9jTOjsNKXhwfZEmAXC1hYb8tI934jdm/view?usp=sharing
Un saludo y gracias de antemano.



Editado por eru - 14/Octubre/2021 a las 17:06
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Octubre/2021 a las 19:00
Hola,

Varias cosas.

No vemos la imagen del mensaje de error. Debes subirla a un sitio publico para adjuntarla.

Utilizar GetOpenFileName 
GetOpenFileName es una API que, si mal no recuerdo, sirve para seleccionar un fichero. Puede ser sustituido por un FileDialog de Office de una forma relativamente sencilla

Utilización de bloques #If
Normalmente bastaría con poner en el #If las llamadas a la API. La definición de la estructura quedaría fuera. 
Si nos fijamos como lo has escrito, vemos que solo diferencias algún Long de LongPtr

LongPtr no es un tipo de variable real; es una especie de "atajo" para decirle al sistema que lo convierta en Long (32 bits) o LongLong (64 bits)

Lo que yo haría es lo siguiente:

- Dejar el bloque #if muy simple:
#If Win64 Then
  Public Declare PtrSafe Get...
#Else
  Public Declare Get...
#End If

- Después dejaría la estructura TYPE como en un código de 32 bits (sin utilizar LongPtr)

En el momento que recibiéramos un error sabríamos cual es la variable que no le gusta y la cambiaríamos s LongPtr (porque se supone que cascará por una Long)

Y así hasta no recibir errores.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
eru Ver desplegable
Nuevo
Nuevo


Unido: 13/Octubre/2021
Localización: España
Estado: Sin conexión
Puntos: 7
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita eru Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Octubre/2021 a las 17:58
Muchas gracias, Xavi.
Hago lo que comentas, pero al ejecutar el código de un botón sigo recibiendo el mismo error, sin ninguna información acerca de qué variable lo produce.
Un saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Octubre/2021 a las 18:47
Si tu código no tiene control de errores, al aceptar el mensaje se posicionará en una línea dónde el código falla.

Por otro lado, ¿has compilado el código para ver que todo está bien? Desde la pantalla de VBA, Depuración, Compilar. Si hay algo mal ahí se quejará (solo detecta errores "de bulto")

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
eru Ver desplegable
Nuevo
Nuevo


Unido: 13/Octubre/2021
Localización: España
Estado: Sin conexión
Puntos: 7
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita eru Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Octubre/2021 a las 19:11
Al compilar ya no da ningún error.
He quitado el control de errores y el error va donde se ve en la imagen:
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Octubre/2021 a las 19:45
Bueno, pues está claro que no tiene nada que ver con el código inicial.

Falta más información de en qué momento salta el error, que valen los argumentos de esa función, si una versión de 64 bits soporta esa forma de vincular, si la cadena de conexión es válida, etc.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
eru Ver desplegable
Nuevo
Nuevo


Unido: 13/Octubre/2021
Localización: España
Estado: Sin conexión
Puntos: 7
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita eru Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Octubre/2021 a las 20:01
Muchas gracias, Xavi.
Como es algo que se me escapa (y ya me da apuro seguir dándote la vara), creo que me buscaré un equipo con Access de 32 bits y apañado Smile
Un saludo muy cordial.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable