Página 2 de 4

Re: Compilar com Harbour

Enviado: 09 Set 2009 16:02
por sygecom
Olá Fladimir,
Para quem não acompa Harbour-Devel, vou resumir aqui, os desenvolvedores do Harbour informaram que essas funções do xharbour foram mal implementas, e que pode usar a função direto com o aplicativo que usa ela, então é só colocar a função abaixo em algum .PRG seu que já resolve:

Código: Selecionar todos

#include "fileio.ch"
#include "common.ch"

*----------------------------------------------------------------------------
FUNCTION FileValid( cFileName, nMaxName, nMaxExt, lWithoutExt, lSpaceInName )
*----------------------------------------------------------------------------
/*
This function return by default, the MS-DOS valid file name (8x3) or an other
format defined by user in accordance with <nMaxName> and <nMaxExt> values.
nMaxName, nMaxExt, lWithoutExt and lSpaceInName are xHarbour extensions.
*/

 Local lRet  := .T.
 Local cName := ""
 Local cExt  := ""
 Local i     := 0
 Local cInvalid := ""
 Local nDecimalPoint := 0
 Local nFileLen := 0

 default cFileName to ""
 default nMaxName  to 8      // max file name len.
 default nMaxExt   to 3      // max extension name len.
 default lWithoutExt to .T.  // allow file name without extension.
 default lSpaceInName to .F. // allow space char in file name.

 if !IsCharacter(cFileName) .or. Empty(cFileName)
    Return .F.
 endif

 if !IsNumber(nMaxName)
    nMaxName := 8
 endif

 if !IsNumber(nMaxExt)
    nMaxExt := 3
 endif

 if !IsLogical(lWithoutExt)
    lWithoutExt := .T.
 endif

 if !IsLogical(lSpaceInName)
    lSpaceInName := .F.
 endif

 if nMaxName <= 0
    Return .F.
 endif

 if nMaxExt <= 0
    nMaxExt := 0
    lWithoutExt := .T.
 endif


 for i := 0 to 255
    if (i>=0  .and. i<=32) .or.;
       i=34 .or.;
       (i>=42 .and. i<=44) .or.;
       (i>=46 .and. i<=47) .or.;
       (i>=58 .and. i<=63) .or.;
       (i>=91 .and. i<=93) .or.;
        i=124 .or. i=127

        cInvalid += chr(i)

    endif
 next

 if lSpaceInName
    cInvalid := StrTran(cInvalid," ","")
 endif

 cFileName := Rtrim(cFileName)

 nDecimalPoint := At(".",cFileName)
 nFileLen      := Len( cFileName )

if nFileLen=0 .or. nFileLen > (nMaxName+nMaxExt+1)
   lRet := .F.
elseif nDecimalPoint > (nMaxName+1)
   lRet := .F.
elseif nDecimalPoint > 0 .and. nMaxExt = 0
   lRet := .F.
elseif nDecimalPoint > 0 .and. nDecimalPoint <= (nMaxName+1)
   cName := SubStr(cFileName,1, nDecimalPoint-1 )
   cExt  := SubStr(cFileName,nDecimalPoint+1 )
   if empty(cName) .or. ( !lWithoutExt .and. empty(cExt) )
      lRet := .F.
   endif
elseif nDecimalPoint=0 .and. !lWithoutExt
   lRet := .F.
elseif nDecimalPoint=0 .and. nFileLen > nMaxName
   lRet := .F.
elseif nDecimalPoint=0 .and. nFileLen <= nMaxName
   cName := cFileName
endif

if lRet

 if !empty(cName)
    if Len(cName) > nMaxName
       lRet := .F.
    endif
 else
    lRet := .F.
 endif

 if lRet .and. ( empty(cExt) .and. !lWithoutExt )
    lRet := .F.
 endif

 if lRet .and. !empty(cExt)
    if Len(cExt) > nMaxExt
       lRet := .F.
    endif
 endif

endif

if lRet

   for i := 1 to Len(cName)
       if SubStr(cName,i,1) $ cInvalid
          lRet := .F.
          exit
       endif
   next

   if lRet .and. !empty(cExt)
      for i := 1 to Len(cExt)
          if SubStr(cExt,i,1) $ cInvalid
             lRet := .F.
             exit
          endif
      next
   endif

endif

Return (lRet)

Re: Compilar com Harbour

Enviado: 09 Set 2009 21:09
por fladimir
Leonardo obrigado e cmo diria minha finada vovozinha (gaúcha de São Luiz Gonzaga) "Mas q bom Barbaridade"

Entendi, e qto ao DiskTotal, DiskReady, DiskFree e CurDirX lá tb explica, posta o link aí pra eu dar uma olhada...

Obrigado!!!

:)Pos

Re: Compilar com Harbour

Enviado: 09 Set 2009 21:22
por sygecom
Coloquei em Anexo o arquivo que contem essas Funçoes

Abaixo o link sobre o FileValid, no Harbour-Devel:
http://www.nabble.com/There-is-a-functi ... 67075.html

Re: Compilar com Harbour

Enviado: 09 Set 2009 21:38
por fladimir
Grato.. vlw

:)Pos

Re: Compilar com Harbour

Enviado: 10 Set 2009 17:23
por Hasse
Boa tarde amigos.

Estou compilando aplicativos com Harbour, BCC55 e MSVC. :)) :)) :))

Despois de compilado o Harbour com BCC, retirei a pasta Harbour de dentro da pasta trunk, coloquei-a no diretório raiz, e alterei o seu nome para Harbour_bcc.

Em seguida fiz a mesma coisa com o Harbour com MSVC e alterei o seu nome para Harbour_VC.

Ficou assim:
C:\Harbour_bcc
C:\Harbour_vc

Em seguida creiei *.bat's dentro das pastas de desenvolvimento de aplicativos, com as variáveis de ambiente e path's para cada caso. Basta rodar o PathBcc.bat ou PathVC.bat, compilar com o HBMK2, e tudo sai funfando beleza.

Obrigado a todos que me ajudaram nesta migração. :{ :-Y

Agora vem o trabalho para os necessários aprendizados e ajustes, efetuar os devidos testes com lista de prg's (*.hbm) e lib's. Finalmente os testes.

Re: Compilar com Harbour

Enviado: 11 Set 2009 01:45
por fladimir
Olá a todos,

Pessoal devido ter mudado de xHarbour par Harbour estou fazendo uns ajustes e com ajuda de colegas consegui resolver a questão das Funções DiskTotal, DiskFree, etc da CT q não estavam no Harbour, compilando junto com meus fontes o DiskUtil.prg, conforme o Leonardo explanou.

Ok partindo deste raciocínio para a Função CurDirX(), procurei ela e econtrei no philes.c no source do xHarbour, ai eu peguei a parte da função e salvei com o nome de CurdirX.C e compilei junto, mas ta dando erro, alguém sabe pq, eu não manjo nada de C e talvez seja alguma sintaxe no arquivo, abaixo o código de como ficou o CurDirX.C e a mensagem de erro.

Código: Selecionar todos

/*
 * $Id: philes.c,v 1.40 2009/08/19 22:40:47 likewolf Exp $
 */

/*
Referidos créditos q apaguei para poupar espaço.
 */

#include <ctype.h>
#include "hbapi.h"
#include "hbapifs.h"
#include "hbapierr.h"
#include "hbapiitm.h"

#define HB_TOUPPER( c )         ( ( c ) >= 'a' && ( c ) <= 'z' ? ( c ) - ( 'a' - 'A' ) : ( c ) )

HB_FUNC( CURDIRX )
{
   USHORT uiErrorOld = hb_fsError();
   BYTE * pbyBuffer = ( BYTE * ) hb_xgrab( HB_PATH_MAX );
   PHB_ITEM pDrv = hb_param( 1, HB_IT_STRING );
   BYTE cCurDrv = hb_fsCurDrv();
   BYTE cDrv;

   if( pDrv && hb_parclen( 1 ) > 0 )
   {
      cDrv = (BYTE) ( HB_TOUPPER( pDrv->item.asString.value[0] ) - 'A');
      if( cDrv != cCurDrv )
      {
         hb_fsChDrv( cDrv );
      }
   }
   else
   {
      cDrv = cCurDrv;
   }

   hb_fsCurDirBuffEx( cDrv, pbyBuffer, HB_PATH_MAX );

   hb_retcAdopt( ( char * ) pbyBuffer );

   hb_fsChDrv( cCurDrv );
   hb_fsSetError( uiErrorOld );
}

Erro apresentando na compilação:
...
vendedor.c
curdirx.c
curdirx.c(67) : error C2223: left of '->item' must point to struct/union
curdirx.c(67) : error C2223: left of '->item' must point to struct/union
curdirx.c(67) : error C2223: left of '->item' must point to struct/union
curdirx.c(67) : error C2223: left of '->item' must point to struct/union
curdirx.c(67) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Generating Code...
hbmk2: Erro: Executando compilador C. 2
...
Grato e Sucesso!!!

:)Pos

Re: Compilar com Harbour

Enviado: 12 Set 2009 22:29
por Hasse
Boa noite colegas.

Acabei de compilar o meu primeiro aplicatico comercial com o Harbour-Msvc.

Neste aplicativo uso a função MilliSec() e a Classe Win32prn(). Ao compilar informa a falta desta função e desta classe.

Incluí o Win32prn.prg e o Cttime.prg na lista dos prg's do script "Fio.hbm", mas acredito que esta forma não é a adequada, pois ficaria eternamente dependente dos prg's de lib's.

Eu tentei incluir no script:

Código: Selecionar todos

-lxhb                            <<== nome lib que supostamente deveria conter o Win32prn() e Millisec().
-LC:\Harbour_vc\lib\win\msvc     <<== Path desta lib.
Mas não adiantou.

Como se faz para dar a volta neste problema ?

Re: Compilar com Harbour

Enviado: 13 Set 2009 14:57
por Itamar M. Lins Jr.
Neste aplicativo uso a função MilliSec() e a Classe Win32prn(). Ao compilar informa a falta desta função e desta classe.
Acrecente a lib hbwin.lib

Código: Selecionar todos

2009-02-04 00:29 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
  * contrib/hbwin/win_reg.prg
  * contrib/hbwin/win_osc.c
  * contrib/hbwin/win_os.prg
  * contrib/hbwin/win_tprn.prg
  * contrib/hbwin/win_tprt.prg
  * contrib/hbwin/win_dll.c
  * contrib/hbwin/win_prn1.c
  * contrib/hbwin/win_regc.c
  * contrib/hbwin/tests/testreg.prg
  * contrib/hbwin/tests/testole.prg
    * Renaming hbwin lib functions to a common and bitwidth-neutral
      namespace, which is WIN_*():
      - W32_REGPATHSPLIT()            -> WIN_REGPATHSPLIT()
      - W32_REGREAD()                 -> WIN_REGREAD()
      - W32_REGWRITE()                -> WIN_REGWRITE()
      - WIN32_REGCREATEKEYEX()        -> WIN_REGCREATEKEYEX()
      - WIN32_REGOPENKEYEX()          -> WIN_REGOPENKEYEX()
      - WIN32_REGQUERYVALUEEX()       -> WIN_REGQUERYVALUEEX()
      - WIN32_REGSETVALUEEX()         -> WIN_REGSETVALUEEX()
      - WIN32_REGCLOSEKEY()           -> WIN_REGCLOSEKEY()

  * contrib/hbwin/win_tprn.prg
  * contrib/hbwin/win_prn1.c
  * contrib/hbwin/tests/testprn.prg
    * Renaming hbwin lib functions/classes to a common and bitwidth-neutral
      namespace, which is WIN_*():
      - WIN32PRN class -> WIN_PRN class.
      - WIN32BMP class -> WIN_BMP class.
      - WIN32_ARC()                   -> WIN_ARC()
      - WIN32_BITMAPSOK()             -> WIN_BITMAPSOK()
      - WIN32_CREATEDC()              -> WIN_CREATEDC()
      - WIN32_CREATEFONT()            -> WIN_CREATEFONT()
      - WIN32_DELETEDC()              -> WIN_DELETEDC()
      - WIN32_DRAWBITMAP()            -> WIN_DRAWBITMAP()
      - WIN32_ELLIPSE()               -> WIN_ELLIPSE()
      - WIN32_ENDDOC()                -> WIN_ENDDOC()
      - WIN32_ENDPAGE()               -> WIN_ENDPAGE()
      - WIN32_ENUMFONTS()             -> WIN_ENUMFONTS()
      - WIN32_FILLRECT()              -> WIN_FILLRECT()
      - WIN32_GETCHARSIZE()           -> WIN_GETCHARSIZE()
      - WIN32_GETDEVICECAPS()         -> WIN_GETDEVICECAPS()
      - WIN32_GETEXEFILENAME()        -> WIN_GETEXEFILENAME()
      - WIN32_GETPRINTERFONTNAME()    -> WIN_GETPRINTERFONTNAME()
      - WIN32_GETTEXTSIZE()           -> WIN_GETTEXTSIZE()
      - WIN32_LINETO()                -> WIN_LINETO()
      - WIN32_LOADBITMAPFILE()        -> WIN_LOADBITMAPFILE()
      - WIN32_MULDIV()                -> WIN_MULDIV()
      - WIN32_OS_ISWIN9X()            -> WIN_OS_ISWIN9X()
      - WIN32_RECTANGLE()             -> WIN_RECTANGLE()
      - WIN32_SETBKMODE()             -> WIN_SETBKMODE()
      - WIN32_SETCOLOR()              -> WIN_SETCOLOR()
      - WIN32_SETDOCUMENTPROPERTIES() -> WIN_SETDOCUMENTPROPERTIES()
      - WIN32_SETMAPMODE()            -> WIN_SETMAPMODE()
      - WIN32_SETPEN()                -> WIN_SETPEN()
      - WIN32_STARTDOC()              -> WIN_STARTDOC()
      - WIN32_STARTPAGE()             -> WIN_STARTPAGE()
      - WIN32_TEXTOUT()               -> WIN_TEXTOUT()

  ; INCOMPATIBLE. Please update your source code.
Saudações,
Itamar M. Lins Jr.

Re: Compilar com Harbour

Enviado: 14 Set 2009 18:06
por Hasse
Boa tarde Itamar.

Obrigado pelo retorno.

A Classe Win32prn() realmente está nesta HbWin.lib, mas a função Millisec() não. Em qual lib estaria esta função ?

Re: Compilar com Harbour

Enviado: 14 Set 2009 18:29
por Maligno
Arquivo XHB.LIB, creio eu.

Re: Compilar com Harbour

Enviado: 15 Set 2009 23:14
por sygecom
Olá Hasse,
Creio que esteja na HBCT.LIB

Re: Compilar com Harbour

Enviado: 16 Set 2009 09:47
por Hasse
Bom dia.

É Maligno, eu também achei que esta função MilliSec() estivesse na XHB.lib, conforme a documentação do xHarbour, mas não está.

O Leonardo é que acertou na mosca. É na (HBct.lib) que ela está.

Eu já estava pensando em testar, uma por uma, todas as 66 lib's que estão no Harbour.

Pelo que estou percebendo, o Harbour tem lá suas diferenças em relação ao xHarbour, no tocante às libs.

Onde poderíamos obter uma lista das funções presentes em cada uma das lib's do Harbour ???

Valeu. Obrigado.

Re: Compilar com Harbour

Enviado: 16 Set 2009 10:49
por Maligno
Quanto à lista não sei responder. Mas no desespero à procura de alguma função, você poderia simplesmente tirar uma listagem dos módulos. O TLINK traz esse recurso. É só executá-lo em linha de comando sem argumentos que a sintaxe aparece. Depois é só ler o TXT que ele devolve. A listagem sai por módulos e o conteúdo de cada módulo. Interessante lembrar, pra quem não sabe: sempre que uma função é incluída no executável, é o módulo (inteiro) que é ligado ao programa. Mesmo que ele contenha dezenas de funções.

Re: Compilar com Harbour

Enviado: 16 Set 2009 22:18
por Hasse
Boa noite Maligno.

Eu imagino que você queria sugerir o TLIB.exe em vez de TLINK.exe.

Bem, eu testei o LIB.exe, o LIBRA.exe e o TLIB.exe, mas nenhum deles abre estas lib's do xHarbour/Harbour. A não ser que eu esteja usando estes aplicativos de forma incorreta. Sempre reporta erro.

No tempo do Clipper eu usava muito o LIB.exe para criar as minhas lib's, como também para listar as funções nelas contidas.

Será que estes aplicativos são somente para uso com lib's compiladas com o Clipper ? É o que está me parecendo.

Re: Compilar com Harbour

Enviado: 17 Set 2009 12:47
por Hasse
Boa tarde colegas.

Estou com mais um problema:

A compilação com o Harbour x msvc está funcionando muito bem no meu DeskTop. Instalei no meu NoteBook e não tem jeito de funcionar. Já estou batalhando uns 5 dias e nada.

É o seguinte:
1-Não sei se é o culpado, mas a sintaxe do path não funciona da maneira tradicional extendida. Só funciona no formato DOS, o seja, como exemplo:
C:\Arquiv~1\Micros~4\VC\lib, etc...
2-A pasta Microsoft Visual Studio 9.0 não é reconhecida por causa do ponto entre 9 e 0. Precisei retirar o ponto de deixar como 90.
3-O Windos XP das 2 máquinas é o mesmo.
4-A compilação reporta erro (a lista é bastante grande e só postei pequena parte dela):

Código: Selecionar todos

hbmk2: Processando arquivo de configura‡Æo: C:\Harbour_vc\bin\hbmk.cfg         
hbmk2: Linkando... Fio400h.exe                                                 
LIBCMT.lib(a_str.obj) : error LNK2001: unresolved external symbol __imp__MultiByteToWideChar@24
LIBCMT.lib(a_cmp.obj) : error LNK2001: unresolved external symbol __imp__MultiByteToWideChar@24
LIBCMT.lib(convrtcp.obj) : error LNK2001: unresolved external symbol __imp__MultiByteToWideChar@24
LIBCMT.lib(read.obj) : error LNK2001: unresolved external symbol __imp__MultiByteToWideChar@24
HBWin.lib(olecore.obj) : error LNK2019: unresolved external symbol __imp__MultiByteToWideChar@24 referenced in function "wchar_t * __cdecl AnsiToWide(char const *)" (?AnsiToWide@@YAPA_WPBD@Z)
hbcommon.lib(hbwince.obj) : error LNK2001: unresolved external symbol __imp__MultiByteToWideChar@24
que suponho seja a falta de várias lib's.

Acredito que em virtude destas alterações feitas nas pastas e path's, algum path não esteja apontando para a pasta adequada.

Parece-me que a LIBCMT.lib(a_str) esteja buscando a variável __imp__MultiByteToWideChar@24 e não encontra. Esta linha é só como exemplo.

Então fica a pergunta: Provavelmente o problema da sintaxe do Path depende de alguma configuração do Windows. Qual seria ?