Estimado Heraclio,
1. Soluci贸n al Error LNK2005: Duplicated symbol: OCCURS
El problema es que est谩s enlazando dos bibliotecas de compatibilidad que intentan hacer lo mismo: hbfoxpro.lib (funciones de FoxPro) y xhb.lib (funciones de xHarbour). Ambas definen la funci贸n OCCURS().
El enlazador de Microsoft (MSVC) es muy estricto y no permite esta ambig眉edad.
La Soluci贸n:
Generalmente, en FiveWin se recomienda priorizar xhb.lib sobre hbfoxpro.lib
- Abre tu archivo de proyecto (.hbp o makefile).
- Busca la l铆nea que incluye hbfoxpro.hbc o -lhbfoxpro.
- Elim铆nala.
- Aseg煤rate de tener inclu铆da xhb.hbc.
驴Por qu茅 funciona esto?
La librer铆a xhb ya contiene una implementaci贸n de OCCURS(). Al quitar hbfoxpro, eliminas la colisi贸n. Si tu c贸digo usa otras funciones espec铆ficas de FoxPro que no est谩n en xhb, av铆same, pero para Occurs, xhb es suficiente.
---
2. Soluci贸n al GPF (Crash) en el m茅todo :Send()
Este es el problema m谩s cr铆tico. El SAT (y el DOF) han actualizado sus servidores para rechazar conexiones que no sean TLS 1.2 o superior. Los componentes OLE (MSXML2 y WinHttp) a veces fallan catastr贸ficamente (GPF) en Windows 11 al negociar estos certificados desde un entorno Harbour/MSVC, especialmente si el Garbage Collector intenta limpiar una variable mientras la conexi贸n OLE sigue "colgada" o en proceso de cierre.
Mi recomendaci贸n fuerte: Deja de usar OLE para esto. P谩sate a hbcurl.
hbcurl es la implementaci贸n nativa de libcurl en Harbour. Es infinitamente m谩s estable, maneja TLS 1.2/1.3 autom谩ticamente y no depende de las caprichosas DLLs de Windows.
Opci贸n A: La soluci贸n robusta (hbcurl)
A帽ade hbcurl.hbc a tu archivo .hbp y usa este c贸digo para descargar la lista:
FUNCTION DescargarListaNegraSAT()
Local cUrl := "http://omawww.sat.gob.mx/cifras_sat/Documents/Listado_Completo_69-B.csv" // Ejemplo URL
Local cSaveFile := "c:\temp\lista69b.csv"
Local hCurl
Local nResult
// Inicializar Curl
hb_curl_global_init()
hCurl := curl_easy_init()
IF ! Empty( hCurl )
// Configurar URL
curl_easy_setopt( hCurl, HB_CURLOPT_URL, cUrl )
// Configurar descarga a archivo
curl_easy_setopt( hCurl, HB_CURLOPT_DOWNLOAD, .T. )
curl_easy_setopt( hCurl, HB_CURLOPT_DL_FILE_SETUP, cSaveFile )
// CR脥TICO PARA EL SAT: Seguir redirecciones y saltar errores de certificado si es necesario
curl_easy_setopt( hCurl, HB_CURLOPT_FOLLOWLOCATION, .T. )
curl_easy_setopt( hCurl, HB_CURLOPT_SSL_VERIFYPEER, .F. ) // 脷til si el SAT cambia la CA intermedia
curl_easy_setopt( hCurl, HB_CURLOPT_SSL_VERIFYHOST, .F. )
// Ejecutar
nResult := curl_easy_perform( hCurl )
IF nResult == 0
MsgInfo( "Descarga exitosa: " + cSaveFile )
ELSE
MsgAlert( "Error en descarga: " + hb_ntos(nResult) )
ENDIF
// Limpieza
curl_easy_cleanup( hCurl )
ENDIF
hb_curl_global_cleanup()
RETURN NIL
Opci贸n B: Insistir con WinHttp (Parche)
Si no puedes cambiar a curl ahora mismo, debes forzar el protocolo de seguridad antes del Send(). Sin embargo, esto no garantiza que el GPF desaparezca si el problema es de memoria en MSVC, pero suele ayudar:
TRY
oHttp := CreateObject( "WinHttp.WinHttpRequest.5.1" )
// 2048 = TLS 1.1, 4096 = TLS 1.2, 8192 = TLS 1.3 (aprox)
// Forzamos TLS 1.2 (0x00000800 = 2048 en hexa, pero el valor suele ser 2048 o 128 seg煤n la versi贸n de winhttp)
// En Windows modernos, usa la constante:
oHttp:Option( 9 ) := 2048 // WinHttpRequestOption_SecureProtocols
oHttp:Open( "GET", "https://www.sat.gob.mx/...", .F. ) // .F. para s铆ncrono
oHttp:Send()
cResp := oHttp:ResponseBody
CATCH oErr
MsgStop( "Error de conexi贸n: " + oErr:Description )
END
Nota: MSXML2.ServerXMLHTTP es a煤n m谩s propenso a fallar que WinHttp.WinHttpRequest.5.1 en descargas directas.
Resumen del Plan de Acci贸n
- Edita tu .hbp: Elimina hbfoxpro.hbc (o la librer铆a -lhbfoxpro). Mant茅n xhb.hbc.
- A帽ade a tu .hbp: hbcurl.hbc.
- Reemplaza tu rutina de descarga OLE por la rutina hbcurl que te puse arriba.