Página 1 de 2

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 08:20
por rubens
Bom dia...

Tendo a definição:

#DEFINE DATACOMP DTOC(DATE())

Como eu poderia fazer para DATACOMP armazenar o literal e não a função?
Eu gostaria de armazenar a data da última compilação automaticamente.

Onde eu buscasse o conteúdo de DATACOMP me retornasse '19/09/2016' e não o resultado de DTOC(DATE()).

Sei que dá para buscar isso do executável mas gostaria de saber se é possível fazer isso com o define.

Obrigado
Rubens

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 10:25
por asimoes
Pode fazer assim:

Bat para compilar:

Código: Selecionar todos

echo %date% %time% > timestamp.txt
hbmk2 estagio.hbp -rebuild 
No .rc (exemplo)
DATACOMP RCDATA timestamp.txt

No prg

Código: Selecionar todos

#define RT_RCDATA       (10)
cDataComp := Hb_LoadResourceRawFile ( "DataComp", RT_RCDATA  ) 
Função Hb_LoadResourceRawFile()

Código: Selecionar todos

#pragma BEGINDUMP
#include <Windows.h>
#include <hbApi.h>

//        HMG_LoadResourceRawFile ( cFileName, cTypeResource | nTypeResourceID )
HB_FUNC ( HB_LOADRESOURCERAWFILE )
{
   HRSRC   hResourceData;
   HGLOBAL hGlobalResource;
   LPVOID  lpGlobalResource = NULL;
   DWORD   nFileSize;
   TCHAR   *FileName     = (TCHAR*) hb_parc(1);
   TCHAR   *TypeResource = HB_ISCHAR (2) ? (TCHAR*) hb_parc(2) : MAKEINTRESOURCE ( hb_parni(2) );

   hResourceData = FindResource ( NULL, FileName, TypeResource );
   if ( hResourceData != NULL )
   {
       hGlobalResource = LoadResource ( NULL, hResourceData );
       if ( hGlobalResource != NULL )
       {
           lpGlobalResource = LockResource ( hGlobalResource );
           if ( lpGlobalResource != NULL ) 
           {
               nFileSize = SizeofResource ( NULL, hResourceData );
               hb_retclen ( (const CHAR *) lpGlobalResource, (HB_SIZE) nFileSize );
           }
           FreeResource ( hGlobalResource );
       }
   }

   if ( lpGlobalResource == NULL )
        hb_retclen ( (const CHAR *) NULL, (HB_SIZE) 0 );
}

#pragma ENDDUMP

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 20:06
por JoséQuintas
Se o problema for só obter um identificador para a versão do programa, o Harbour já faz isso automaticamente.
Pode compilar com a versão

-tshead=build.ch

Com essa versão ele gera o arquivo build.ch
O arquivo build.ch :

/* Automatically generated by hbmk2. Do not edit. */
#define _HBMK_BUILD_DATE_ "20160818"
#define _HBMK_BUILD_TIME_ "185538"
#define _HBMK_BUILD_TIMESTAMP_ "20160818185538201"

Daí vc pode fazer no seu código :

#include "build.ch"
https://pctoledo.org/forum/viewto ... 51#p109155

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 20:14
por JoséQuintas
Repetir o outro post, porque aqui fica no lugar correto.
Demorei pra encontrar o post anterior porque está em outro assunto.

Resolvi assim, porque o do Harbour não me atendeu.

Este fonte compilado:

Código: Selecionar todos

PROCEDURE Main

 LOCAL cDateTime, cTxt, nBuildNum, cBuildFile

 cBuildFile := "d:\cdrom\fontes\build\build.ch"
 cDateTime := Dtos( Date() ) + Substr( Time(), 1, 2 ) + Substr( Time(), 4, 2 )

 nBuildNum := Val( Substr( MemoRead( cBuildFile ), 4, 10 ) ) + 1
 cTxt := "// " + Str( nBuildNum, 10 ) + hb_Eol()
 cTxt += "#define JPA_VERSAO  " + ["] + Transform( cDateTime, "@R 9999.99.99.9999" ) + ["] + hb_Eol()
 cTxt += "#define JPA_VERSAO_RC " + Transform( cDateTime, "@R 9999,99,99,9999" ) + hb_Eol()
 hb_MemoWrit( cBuildFile, cTxt )

 RETURN
chamado no bat de compilação:

Código: Selecionar todos

del jpa.exe
d:\cdrom\fontes\build\build
hbmk2 jpa.hbp %1 %2 %3 %4 %5
if not errorlevel 1 assina jpa.exe
que gera este arquivo:

Código: Selecionar todos

//        705
#define JPA_VERSAO    "2016.09.19.1837"
#define JPA_VERSAO_RC  2016,09,19,1837
no meu fonte principal:

Código: Selecionar todos

#include "build.ch"
AppVersaoExe( JPA_VERSAO ) 
e no jpa.rc:

Código: Selecionar todos

#include "build.ch"

1 VERSIONINFO
  FILEVERSION JPA_VERSAO_RC

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 20:41
por asimoes
Quintas,

Faltou publicar a function AppVersaoExe( JPA_VERSAO )

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 21:22
por JoséQuintas
Faltou não, eu só não deveria ter postado parte do meu fonte.... rs
Só imaginar o #define como se fosse uma variável.

Código: Selecionar todos

// #define JPA_VERSAO  "2016.09.19.1837"
#include "build.ch"

@ 1, 0 SAY "Versao " + JPA_VERSAO

Definir data de compilação com DEFINE

Enviado: 19 Set 2016 23:10
por Toledo
Amigos, uma outra opção seria pegar a data do arquivo EXE:

Código: Selecionar todos

cExeNome:=ExeName()
DATACOMP:=FileDate(cExeNome)
Abraços,

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 00:15
por JoséQuintas
Não dá muito certo, porque se baixar da internet, a data acaba sendo a data de download.
E aí começa a precisar de outras precauções.

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 07:41
por asimoes
Quintas,

Sei que existe inúmeras maneiras de pescar essa informação da data e quanto ao seu .rc

#include "build.ch"

1 VERSIONINFO
FILEVERSION JPA_VERSAO_RC

Como é que você pega o valor? ou bata informar o include que eu tenho acesso ao valor de JPA_VERSAO_RC ?

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 08:19
por asimoes
Quintas

Descobri uma forma de criar o build.ch na própria bat de compilação.

echo #define build_date "%date%" > build.ch
echo #define build_time "%time%" >> build.ch

Ou

echo #define buildapp "%date% %time%" > build.ch

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 08:31
por frazato
Bom dia! uso de uma maneira mais simples a criação de versão em meu sistema, uso da seguinte maneira:
1- Crio um executável ( Cria_vers )
2- Coloco o versao.prg para compilar junto com o sistema
3- Coloco em BAT para executar o cria_Ver para gerar um novo versao.prg

Frazato

Código: Selecionar todos

/*
   Rotina de criaoca de numero de verao
   tera que ser utiliza antes do processo compilacao do sistema
   Joao Frazato
*/

Estru := { {"Data"    , "D" , 08,0 },;
           {"Geracao" , "N" , 08,0 } }

If ! file("versao.dbf")
     Dbcreate("Versao.dbf",Estru)
Endif


Close All

Sele 1
     use Versao
     go bott
     nnumero := Geracao+1
     Append Blank
     Repla Data     With date()
     Repla Geracao  With nnumero


     If File("Versao.prg")
        delete File versao.prg
     Endif

     cTxtcArq    := 'Versao.prg'
     cxbase      := {}
     QuebraLinha := Chr(13)+Chr(10)

     Aadd(cxbase,'Function Ver_Jaf_Versao()' )
     Aadd(cxbase,'Local nVersao:="'+Dtos(data)+'-'+strZero(nNumero,3)+'"' )
     Aadd(cxbase,'Return nVersao' )

     Handle := FCreate(cTxtcArq)
     If Ferror() # 0
        alert("Impossivel gravar o pedido Temporario "+cTxtcArq)
     Endif

     For x:= 1 to Len(cxbase)
         Fwrite(Handle,cxbase[x]+QuebraLinha)
     Next

     FCLOSE(HANDLE)

Return nil

Código: Selecionar todos

Function Ver_Jaf_Versao()
Local nVersao:="20100929-355"
Return nVersao

Código: Selecionar todos

@ECHO OFF
CRI_VERS.EXE
HBMAKE SISTEMA.BC

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 08:31
por Toledo
Amigos, compile este demo:

demo.prg

Código: Selecionar todos

#include "demo.ch"
PROCEDURE Main
   SET CENTURY ON
   SET DATE FORMAT TO "dd/mm/yyyy"
   CLS
   ? StoD(_HBMK_BUILD_DATE_)
   ? Transf(_HBMK_BUILD_TIME_,"@R 99:99:99")
RETURN
Compile com hbmk2 e com opção -tshead=demo, por exemplo:

hbmk2 demo.prg -tshead=demo

Com a opção -tshead=demo será criado o arquivo demo.ch contendo as macros _HBMK_BUILD_DATE_, _HBMK_BUILD_TIME_, _HBMK_BUILD_TIMESTAMP_ com a data/hora de criação do arquivo.

Observe que no inicio do DEMO.PRG estou chamando o demo.ch

Abraços,

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 08:44
por asimoes
As opções são muitas é só escolher:

For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a:%%b)
echo #define buildapp "%date%_%mytime%" > build.ch

O resultado em build.ch é:

#define buildapp "20/09/2016_09:01"

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 09:17
por rubens
Bom dia...

Esse e o tipo de rotina que quem gosta mesmo de achar soluções dá uma olhadinha e pensa: 'Tem jeito de melhorar"... kkk
Obrigado pelas respostas...

Acabei adotando a última que o toledo postou. Ficou jóia...
Só uma ressalva, fiquei empolgado e fui dar uma de programador aqui, e resolvi usar um ch existente... já viram né o que que deu... o hbmk2 gravou em cima kkkkkkkkkkk ainda bem que tinha cópia do ch...

Obrigado
Valeu...

Rubens

Definir data de compilação com DEFINE

Enviado: 20 Set 2016 09:36
por asimoes
Com harbour 3.4 o comando é -bldhead=build.ch