Conflicto de símbolos duplicados: OCCURS y errores de conexión con MSXML2

Post Reply
cpheraclio
Posts: 26
Joined: Thu Mar 17, 2022 6:47 pm

Conflicto de símbolos duplicados: OCCURS y errores de conexión con MSXML2

Post by cpheraclio »

Hola a todos,

Estoy trabajando en una rutina para descargar información fiscal (por ejemplo Lista Negra 69-B del SAT) en FiveWin, pero me he topado con un par de problemas que no he podido resolver:

Símbolo Duplicado (OCCURS): Al compilar mi proyecto, el enlazador arroja un error de "Duplicated symbol: OCCURS".
Estoy intentando realizar peticiones GET a sitios oficiales (SAT/DOF). Cuando utilizo CreateObject("MSXML2.ServerXMLHTTP.6.0") o WinHttp.WinHttpRequest.5.1, la aplicación se cierra inesperadamente (GPF) justo en el método :Send(). Mi sistema operativo es Windows 11.

¿Alguien ha pasado por esto recientemente con las URLs actuales del SAT (México)? Agradecería mucho cualquier orientación sobre cómo gestionar estas conexiones de forma estable sin que "truene" el ejecutable y cómo solucionar la colisión de la función OCCURS.

FiveWin 2512 Harbour MSVC2022

hbfoxpro.lib(occurs.obj) : error LNK2005: ya se defini¢ _HB_FUN_OCCURS en xhb.lib(xhbmisc.obj)
Contafi.exe : fatal error LNK1169: se encontraron uno o m s s¡mbolos definidos simult neamente
hbmk2[contafi]: Error: Running linker. 1169
link.exe @C:\Users\Admin\AppData\Local\Temp\g0h3op.lnk

hbmk2: Hint: Add option 'hbfoxpro.hbc' for missing function(s): Occurs()
hbmk2: Hint: Add option 'xhb.hbc' for missing function(s): Occurs()

Saludos cordiales.

User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Conflicto de símbolos duplicados: OCCURS y errores de conexión con MSXML2

Post by Antonio Linares »

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

  1. Abre tu archivo de proyecto (.hbp o makefile).
  2. Busca la línea que incluye hbfoxpro.hbc o -lhbfoxpro.
  3. Elimínala.
  4. 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:

Code: Select all | Expand

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:

Code: Select all | Expand

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
  1. Edita tu .hbp: Elimina hbfoxpro.hbc (o la librería -lhbfoxpro). Mantén xhb.hbc.
  2. Añade a tu .hbp: hbcurl.hbc.
  3. Reemplaza tu rutina de descarga OLE por la rutina hbcurl que te puse arriba.
regards, saludos

Antonio Linares
www.fivetechsoft.com
cpheraclio
Posts: 26
Joined: Thu Mar 17, 2022 6:47 pm

Re: Conflicto de símbolos duplicados: OCCURS y errores de conexión con MSXML2

Post by cpheraclio »

Gracias por responder:

Ahora se presenta el siguiente mensaje

error LNK2001: s¡mbolo externo _HB_FUN_HB_CURL_GLOBAL_INIT sin resolver
error LNK2001: s¡mbolo externo _HB_FUN_HB_CURL_GLOBAL_CLEANUP sin resolver

Contenido de .hbp

-Lc:\fwh\lib

-lFiveH32
-lFiveHC32
-llibmariadb32

-lgdiplus
-lole32
-lOleDlg
-lversion
-lucrt
-luxtheme

-lace32
-lrddads
-lhbzebra
-lhbhpdf
-llibhpdf
-llibcurl
-lhbcurl
-lhbtip

#ficheros de configuración debido a las funciones usadas
xhb.hbc
hbct.hbc
hbwin.hbc
hbmzip.hbc
hbziparc.hbc
#hbfoxpro.hbc
hbcurl.hbc

-ldflag=/NODEFAULTLIB:msvcrt
-ldflag+=/NODEFAULTLIB:libucrt

User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Conflicto de símbolos duplicados: OCCURS y errores de conexión con MSXML2

Post by Antonio Linares »

Que versión de Harbour estás usando ?

La más reciente desde https://github.com/FiveTechSoft/harbour ... our_builds ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
cpheraclio
Posts: 26
Joined: Thu Mar 17, 2022 6:47 pm

Re: Conflicto de símbolos duplicados: OCCURS y errores de conexión con MSXML2

Post by cpheraclio »

Antonio:

Si, es la versión más reciente, para mayor seguridad los cambié con los del link que me proporcionaste.

Estaba utilizando los que nos proporcionaste en el webinar sobre IA

Saludos.

Post Reply