Estimado Heraclio,
El problema que estás experimentando es un clásico en la migración de 32 a 64 bits. No es un error de tu código ni de Harbour en sí, sino una limitación de los controladores de base de datos de Windows.
Aquí tienes la explicación técnica y la solución paso a paso.
-----
La Causa Raíz
El proveedor que has usado siempre, Microsoft.Jet.OLEDB.4.0 (para archivos .mdb), solo existe en versión de 32 bits. No existe una versión de 64 bits de este motor.
Al compilar tu aplicación en 64 bits (Visual Studio), tu programa intenta cargar una DLL de 32 bits, lo cual es imposible en Windows, provocando el fallo inmediato.
La Solución: Usar el motor "ACE"
Para conectar a Access (ya sea .mdb o .accdb) desde una aplicación de 64 bits, debes usar el proveedor Microsoft.ACE.OLEDB.12.0 (o 16.0).
Sigue estos pasos para solucionarlo:
1\. Instalar el motor de base de datos de 64 bits
Necesitas instalar el "Microsoft Access Database Engine" en su versión de 64 bits.
- Descarga: Busca en Google "Microsoft Access Database Engine 2010 Redistributable" o "2016 Redistributable".
- Importante: Si tienes instalado Microsoft Office de 32 bits en esa misma máquina, el instalador de 64 bits te dará error. Para forzar la instalación, debes ejecutar el instalador desde la línea de comandos con el parámetro pasivo:
AccessDatabaseEngine_x64.exe /passive
2\. Cambiar la cadena de conexión
FW_OpenAdoConnection de FiveWin intenta a menudo adivinar el proveedor. Para 64 bits, es mejor ser explícito o construir la cadena tú mismo.
Intenta cambiar tu código de esto:
Code: Select all | Expand
oCn := FW_OpenAdoConnection("C:\NOMINA\EMPRESA\datos.mdb,mypassword", .T.)
A una conexión explícita usando el proveedor ACE:
Code: Select all | Expand
local cStr, oCn, oError
// Nota el cambio de Provider a Microsoft.ACE.OLEDB.12.0
cStr := "Provider=Microsoft.ACE.OLEDB.12.0;" + ;
"Data Source=C:\NOMINA\EMPRESA\datos.mdb;" + ;
"Jet OLEDB:Database Password=mypassword;" + ;
"Persist Security Info=False;"
TRY
oCn := CreateObject( "ADODB.Connection" )
oCn:Open( cStr )
? "Conexión 64 bits exitosa"
CATCH oError
? "Error:", oError:Description
END
Nota: Aunque tu archivo sea .mdb (formato viejo), el motor ACE.OLEDB.12.0 es capaz de leerlo perfectamente, pero necesitas indicárselo en el "Provider".
-----
Resumen de diferencias
Característica32 Bits (xHarbour/BCC)64 Bits (Harbour/MSVC)
ProviderMicrosoft.Jet.OLEDB.4.0Microsoft.ACE.OLEDB.12.0
Driver requeridoViene con Windows (default)Requiere instalación manual (Access DB Engine x64)
CompatibilidadOffice 32 bitsOffice 64 bits (o instalación con /passive)
¿Qué pasa si FW_OpenAdoConnection falla?
Si la función nativa de FiveWin FW_OpenAdoConnection sigue fallando incluso con el driver instalado, es posible que la función internamente esté forzando el uso de "Jet". En ese caso, usa la creación del objeto ADODB.Connection manualmente como te mostré en el ejemplo de código arriba. Funciona exactamente igual para el resto de tu lógica.