Itamar M. Lins Jr. escreveu:Não sei pq não funciona -fullstatic e static (não fazem efeito)

A lib NÃO substitui a DLL, ela apenas tem as rotinas intermediárias pra usar a DLL.
Pra ser fullstatic, precisaria ter os FONTES pra entrarem no lugar da LIB.
Como ninguém iria dar manutenção em fontes... a opção de DLL é a mais viável.
O mesmo com MySQL, que tem fontes pra serem usados com C, no MySQL original, mas não são usados.
E isso significa que pode chegar uma hora, que nem a LIB do Harbour vai funcionar mais, com DLLs mais novas que não sejam compatíveis internamente.
Só recapitulando:
1)
O utilitário IMPLIB (ou algo assim), ele gera uma LIB pra uso da DLL.
Digamos que seja aquilo que a gente costuma fazer: CallDll( .... ).
UMA das LIBs apenas substitui essas declarações.
2)
Apenas isso não é suficiente, porque tem muito mais tipos em linguagem C do que em Harbour.
A LIB do Harbour é outra intermediária, que converte os tipos pra ficarem compatíveis com as chamadas.
Se quiser, pode comparar com a classe que fiz pra RMCHART.
Nela tem as funções ToDouble(), ToInt(), etc. pra converter os números para o formato das funções do RMChart.
E também tem as CallDll() pra acessar a DLL.
Código: Selecionar todos
METHOD AddDataAxis(a,b,c,d,e, ... ) INLINE ::CallDllStd( "RMC_ADDDATAAXIS", a, b, c, ::ToDecimal( d ), ::ToDecimal( e ), ... )
METHOD AddGrid( ... ) INLINE ::CallDllStd( "RMC_ADDGRID", ... )
METHOD AddGridLessSeries(a,b,c,d,e,...) INLINE ::CallDllStd( "RMC_ADDGRIDLESSSERIES", a, b, ::ToDouble( c ), d, ::ToLong( e ), ... )
METHOD AddHightLowSeries(a,b,c,...) INLINE ::CallDllStd( "RMC_ADDHIGHTLOWSERIES", a, b, ::ToDouble( c ), ... )
METHOD CallDllStd( cName, ... ) INLINE hb_DynCall( { cName, ::hDLL, HB_DYN_CALLCONV_STDCALL }, ... )
METHOD ToDecimal( xValue ) INLINE xValue + 1.01 - 1.01
METHOD ToDouble( xValue )
METHOD ToLong( xValue )
Aí dá pra ver que tem o CallDll() pra cada função do RMChart, isso é o que o IMPORTLIB faria, geraria uma LIB com essas declarações, PRA USAR A DLL.
Mesmo assim, ainda faltaria a conversão conforme o tipo de parâmetro, que nesse caso usei ToDouble(), ToLong(), ToDecimal(), etc.
Isso é o que a lib do Harbour faz.
Então acabam sendo 2 LIBs e mais a DLL: uma lib só com declarações de funções, e outra pra converter direito cada parâmetro
E... não substitui a DLL, porque é justamente pra usar a DLL.
Minha classe pra RMCHART acabou fazendo o papel do que seriam essas duas LIBs: declarou as funções da DLL, e converte conforme parâmetros.
E isso não substituiu a DLL do RMChart, apenas permite usar a DLL.
Só comparei com a classe do RMChart como forma de ficar mais fácil de entender.
Não sou nenhum expert nessas coisas, mas no caso do RMChart tentei e deu certo.