Modificar código 32 bits para 64 bits |
Responder |
Autor | |
eru
Nuevo Unido: 13/Octubre/2021 Localización: España Estado: Sin conexión Puntos: 7 |
Opciones de entrada
Gracias(0)
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 |
|
xavi
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 Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: en línea Puntos: 14738 |
Opciones de entrada
Gracias(0)
|
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
|
|
eru
Nuevo Unido: 13/Octubre/2021 Localización: España Estado: Sin conexión Puntos: 7 |
Opciones de entrada
Gracias(0)
|
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.
|
|
xavi
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 Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: en línea Puntos: 14738 |
Opciones de entrada
Gracias(0)
|
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 |
|
eru
Nuevo Unido: 13/Octubre/2021 Localización: España Estado: Sin conexión Puntos: 7 |
Opciones de entrada
Gracias(0)
|
Al compilar ya no da ningún error.
He quitado el control de errores y el error va donde se ve en la imagen:
|
|
xavi
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 Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: en línea Puntos: 14738 |
Opciones de entrada
Gracias(0)
|
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
|
|
eru
Nuevo Unido: 13/Octubre/2021 Localización: España Estado: Sin conexión Puntos: 7 |
Opciones de entrada
Gracias(0)
|
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 Un saludo muy cordial.
|
|
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 |