FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Conflicto de s铆mbolos duplicados: OCCURS y errores de conexi贸n con MSXML2
Posts: 26
Joined: Thu Mar 17, 2022 06:47 PM
Conflicto de s铆mbolos duplicados: OCCURS y errores de conexi贸n con MSXML2
Posted: Sun Jan 11, 2026 10:16 PM

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.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Conflicto de s铆mbolos duplicados: OCCURS y errores de conexi贸n con MSXML2
Posted: Mon Jan 12, 2026 04:20 AM

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 (harbour): Select all Collapse
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 (harbour): Select all Collapse
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
Posts: 26
Joined: Thu Mar 17, 2022 06:47 PM
Re: Conflicto de s铆mbolos duplicados: OCCURS y errores de conexi贸n con MSXML2
Posted: Mon Jan 12, 2026 01:58 PM

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

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Conflicto de s铆mbolos duplicados: OCCURS y errores de conexi贸n con MSXML2
Posted: Mon Jan 12, 2026 03:53 PM

Que versi贸n de Harbour est谩s usando ?

La m谩s reciente desde https://github.com/FiveTechSoft/harbour_and_xharbour_builds ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 26
Joined: Thu Mar 17, 2022 06:47 PM
Re: Conflicto de s铆mbolos duplicados: OCCURS y errores de conexi贸n con MSXML2
Posted: Mon Jan 12, 2026 05:22 PM

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.

Continue the discussion