Página 1 de 1

xharbour + MSVC 2022 - 64 bits

Enviado: 19 Abr 2024 10:50
por sygecom
Olá Pessoal.

Estou com dois erros em xharbour(atual git) + msvc 2022 64 bits.

Esse erro abaixo é por que tenho o meu ErrorSys e tem o do xharbour, até posso renomear o meu e resolver, mas achei estranho que esse erro não acontece com BCC.
rtl.lib(errorsys.obj) : error LNK2005: HB_FUN_ERRORSYS already defined in errorsys.obj

Esses erros abaixo é por que não existe para 64 bits a FUNCTION DLLCALL e, conferi no source do xharbour e realmente tem um ifdef para apenas 32 bits, alguém sabe como contornar isso em 64 bits no xharbour ?

Código: Selecionar todos

sagi_cancela_toledo.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
sagi_email.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
ACBrBoleto.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
syg_uteis_xhb_msvc64.lib(webcam.obj) : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
balancas.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
five.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
sagi_biometria.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL
sagi_cameras.obj : error LNK2001: unresolved external symbol HB_FUN_DLLCALL

xharbour + MSVC 2022 - 64 bits

Enviado: 19 Abr 2024 11:05
por JoséQuintas
Temporário ou definitivo ?

Como temporário, é criar uma função fake pra tapar buraco.
Isso vai impedir de chamar rotinas em DLL, mas pelo menos deixa você testar todo restante.
Se todo restante ok, aí vai atrás dessa.
Acho que vai precisar CALLDLL diferente pra DLLs 32/64 bits, supondo que aceite chamar 32 a partir de 64, não sei dizer se isso é possível.

Quanto ao outro erro, de errorsys duplicado....
É que o Borland C aceita tudo duplicado e por isso não dá erro.
No mingw tem como passar parâmetro pra ele aceitar isso.
No MSVC não sei se tem.

No mingw também acusa resource duplicado, era normal ter erro conforme a LIB.

xharbour + MSVC 2022 - 64 bits

Enviado: 19 Abr 2024 12:45
por sygecom
Preciso de algo definitivo, até mesmo pra poder testar se em 64bits vou conseguir consumir as dll que são 32 bits.

xharbour + MSVC 2022 - 64 bits

Enviado: 19 Abr 2024 14:01
por JoséQuintas
pegar da minigui talvez, ou fivewin.

xharbour + MSVC 2022 - 64 bits

Enviado: 19 Abr 2024 14:45
por Itamar M. Lins Jr.
Olá!
Preciso de algo definitivo, até mesmo pra poder testar se em 64bits vou conseguir consumir as dll que são 32 bits.
Reportar para o Enrico Maria Giordano e esperar a resposta dele. Ele está ativo no xHarbour.

Código: Selecionar todos

2024-04-13 12:20 UTC+0200 Enrico Maria Giordano <e.m.giordano@emagsoftware.it>
  * source\compiler\harbour.c
  * source\compiler\genc.c
  * source\compiler\genhrb.c
  * source\vm\runner.c
  * source\rtl\tprinter.c
    ! Fixed compiler warnings
Saudações,
Itamar M. Lins Jr.

xharbour + MSVC 2022 - 64 bits

Enviado: 20 Abr 2024 11:24
por sygecom
Venho conversando por e-mail com Enrico a alguns dias e, ele me mandou uma solução que funciona.

Segue abaixo, exemplo:

Código: Selecionar todos

FUNCTION MAIN()

    LOCAL cPath := GETENV( "CommonProgramFiles(x86)" )

    ? cPath
    ? LFN2SFN( cPath )

    INKEY( 0 )

    RETURN NIL


FUNCTION LFN2SFN( cDir )

    LOCAL cBuffer := SPACE( 261 )
    LOCAL nLen    := GETSHORTPATHNAME( cDir, @cBuffer, LEN( cBuffer ) )

    RETURN IF( nLen != NIL, LEFT( cBuffer, nLen ), cBuffer )


#define DC_CALL_CDECL 0x0010


FUNCTION GETSHORTPATHNAME( cPar1, cPar2, nPar3 )

    LOCAL nHandle := DLLLOAD( "Kernel32.dll" )
    LOCAL nRet := 0

    IF !EMPTY( nHandle )
        nRet = DLLCALL( nHandle, DC_CALL_CDECL, "GetShortPathNameA", cPar1, cPar2, nPar3 )
    ENDIF

    DLLUNLOAD( nHandle )

    RETURN nRet

#command IF <condition> THEN <*statements*> => if <condition> ; <statements> ; end


FUNCTION DLLCALL( nHandle, nDummy, cFuncName, xPar1, xPar2, xPar3, xPar4, xPar5, xPar6, xPar7, xPar8, xPar9, xPar10, xPar11, xPar12 )

    LOCAL cTyp1  := "C"
    LOCAL cTyp2  := "C"
    LOCAL cTyp3  := "C"
    LOCAL cTyp4  := "C"
    LOCAL cTyp5  := "C"
    LOCAL cTyp6  := "C"
    LOCAL cTyp7  := "C"
    LOCAL cTyp8  := "C"
    LOCAL cTyp9  := "C"
    LOCAL cTyp10 := "C"
    LOCAL cTyp11 := "C"
    LOCAL cTyp12 := "C"

    ( nDummy )

    IF VALTYPE( xPar1 )  = "N" THEN cTyp1  = "N"
    IF VALTYPE( xPar2 )  = "N" THEN cTyp2  = "N"
    IF VALTYPE( xPar3 )  = "N" THEN cTyp3  = "N"
    IF VALTYPE( xPar4 )  = "N" THEN cTyp4  = "N"
    IF VALTYPE( xPar5 )  = "N" THEN cTyp5  = "N"
    IF VALTYPE( xPar6 )  = "N" THEN cTyp6  = "N"
    IF VALTYPE( xPar7 )  = "N" THEN cTyp7  = "N"
    IF VALTYPE( xPar8 )  = "N" THEN cTyp8  = "N"
    IF VALTYPE( xPar9 )  = "N" THEN cTyp9  = "N"
    IF VALTYPE( xPar10 ) = "N" THEN cTyp10 = "N"
    IF VALTYPE( xPar11 ) = "N" THEN cTyp11 = "N"
    IF VALTYPE( xPar12 ) = "N" THEN cTyp12 = "N"

    RETURN CALLDLL( nHandle, cFuncName, xPar1, cTyp1, xPar2, cTyp2, xPar3, cTyp3, xPar4, cTyp4, xPar5, cTyp5, xPar6, cTyp6, xPar7, cTyp7, xPar8, cTyp8, xPar9, cTyp9, xPar10, cTyp10, xPar11, cTyp11, xPar12, cTyp12 )


#pragma BEGINDUMP

#include "windows.h"
#include "hbapi.h"


HB_FUNC( CALLDLL )
{
    FARPROC pFunc = GetProcAddress( hb_parptr( 1 ), hb_parc( 2 ) );

    void *pPrm1;
    void *pPrm2;
    void *pPrm3;
    void *pPrm4;
    void *pPrm5;
    void *pPrm6;
    void *pPrm7;
    void *pPrm8;
    void *pPrm9;
    void *pPrm10;
    void *pPrm11;
    void *pPrm12;

    pPrm1  = *hb_parc( 4 )  == 'C' ? hb_parc( 3 )  : ( void * ) hb_parnll( 3 );
    pPrm2  = *hb_parc( 6 )  == 'C' ? hb_parc( 5 )  : ( void * ) hb_parnll( 5 );
    pPrm3  = *hb_parc( 8 )  == 'C' ? hb_parc( 7 )  : ( void * ) hb_parnll( 7 );
    pPrm4  = *hb_parc( 10 ) == 'C' ? hb_parc( 9 )  : ( void * ) hb_parnll( 9 );
    pPrm5  = *hb_parc( 12 ) == 'C' ? hb_parc( 11 ) : ( void * ) hb_parnll( 11 );
    pPrm6  = *hb_parc( 14 ) == 'C' ? hb_parc( 13 ) : ( void * ) hb_parnll( 13 );
    pPrm7  = *hb_parc( 16 ) == 'C' ? hb_parc( 15 ) : ( void * ) hb_parnll( 15 );
    pPrm8  = *hb_parc( 18 ) == 'C' ? hb_parc( 17 ) : ( void * ) hb_parnll( 17 );
    pPrm9  = *hb_parc( 20 ) == 'C' ? hb_parc( 19 ) : ( void * ) hb_parnll( 19 );
    pPrm10 = *hb_parc( 22 ) == 'C' ? hb_parc( 21 ) : ( void * ) hb_parnll( 21 );
    pPrm11 = *hb_parc( 24 ) == 'C' ? hb_parc( 23 ) : ( void * ) hb_parnll( 23 );
    pPrm12 = *hb_parc( 26 ) == 'C' ? hb_parc( 25 ) : ( void * ) hb_parnll( 25 );

    hb_retnl( ( LONG ) ( *pFunc ) ( pPrm1, pPrm2, pPrm3, pPrm4, pPrm5, pPrm6, pPrm7, pPrm8, pPrm9, pPrm10, pPrm11, pPrm12 ) );
}

#pragma ENDDUMP