Dejo otra alternativa. Difiere de la de fivewidi en que genera/mantiene el archivo .rc que se incrusta en la aplicación
/***************
Prog : GenBuild.prg
Autor : eMeGe
Módulo : unico
Inicio : 16/02/2012
Liberado : 22/02/2012
Versiones : 1.00 Operable
Idea original en: <!-- l --><a class="postlink-local" href="http://forums.fivetechsupport.com/viewtopic.php?f=6&t=23215#p124598">viewtopic.php?f=6&t=23215#p124598</a><!-- l --> » Jue Ene 05, 2012 6:24 am » by hmpaquito
version optimizada » by FiveWiDi
Proyecto:
1) Se podría generar un solo GenBuild para todos nuestros proyectos,
en lugar de un genBuild para cada proyecto entonces el .dbf podría ser así:
dbCreate( scPathDB+cDBF+".dbf", ;
{ ;
{ "Aplicacion", "C", 8, 0 }, ;
{ "BuildNro", "N", 5, 0 } ;
} )
con indice sobre campo "Aplicación" para realizar las busquedas y
actualizar el Build en consecuencia
2) Con el mismo criterio de la generación/mantenimiento del .rc
se puede hacer el mantenimiento de archivos de instalacion
Inno
*****************************************************************
*/
#include "fivewin.ch"
// Estaticas
GLOBAL aStaticsMain[ 5 ]
#xtranslate saDatVers => aStaticsMain\[1\]
#xtranslate saHeader => aStaticsMain\[2\]
#xtranslate scPathDB => aStaticsMain\[3\]
#xtranslate scAppName => aStaticsMain\[4\]
#xtranslate snBldNumber => aStaticsMain\[5\]
PROCEDURE Main()
// Camino
DEFAULT scPathDB:= ".\" // camino de archivos .dbf, .rc, .log
// Aplicacion
scAppName:= "tuApp"
// Genera/Actualiza Build
SetBuild()
// Cabecera
saHeader:= { "/*----------------------------------------------------", ;
" Autor.....: ", ;
" Correo-e..: ", ;
"", ; // archivo de...
" COPYRIGHT.: (c) "+Str( Year(Date()),,,.T.)+" Tu Empresa", ;
"------------------------------------------------------*/" }
// datos de la Versión
saDatVers:= Hash( "Version", 'FILEVERSION 0,17,1,12', ;
"FileVersion", '"0.017.0212.'+Str(snBldNumber,,,.T.)+'\000"', ;
"FileDescription", '"Sistema de...\000"', ;
"InternalName", '"tuApp\000"', ;
"LegalCopyright", '"'+Str( Year(Date()),,,.T.)+' © Tu Empresa\000"', ;
"ProductName", '"'+Str( Year(Date()),,,.T.)+' Tu Empresa\000"', ;
"ProductVersion", '"ßeta 0.017.0212 (Build '+Str(snBldNumber,,,.T.)+')\000"', ;
"OriginalFilename",'"tuApp.exe\000"' )
// Genera/Actualiza .rc
SetRC()
// Genera/Actualiza .log
SetLog()
// Fin
// ------------------------------------------------------------------------- \\
// Establecer próximo Build
//
PROCEDURE SetBuild()
local cDBF:= "BD"+AfterAtNum( "mg", scAppName ) // mio; cambiar segun gusto
IF !File( scPathDB+cDBF+".dbf")
dbCreate( scPathDB+cDBF+".dbf", ;
{ ;
{ "BuildNro", "N", 5, 0 } ;
} )
SELECT 0
USE ( scPathDB+cDBF )
APPEND BLANK
ELSE
SELECT 0
USE ( scPathDB+cDBF )
ENDIF
snBldNumber:= ( cDBF )->BuildNro +1
RLock() // lo dejo por compatibilidad. Si se usa un genbuild.exe x aplicacion no es necesario
REPLACE BuildNro WITH snBldNumber
UNLOCK
COMMIT
CLOSE ( cDBF )
// Fin
// ------------------------------------------------------------------------- \\
// Archivo app.rc
//
PROCEDURE SetRC()
local oRC, ;
cArchRC:= scPathDB+scAppName+".rc", ;
nX
if !File( cArchRC )
saHeader[4]:= " Archivo...: recursos"
oRC:= TTxtFile():New( cArchRC )
if oRC:Open()
for nX:= 1 to Len( saHeader )
oRC:Add( saHeader[nX] )
next
oRC:Add( '1 24 "d:/bat/theme.man"' ) // corresponde a WindowsXP.Manifest
oRC:Add( 'PryYo32 ICON "tuApp.ico"' ) // ícono para la aplicación
oRC:Add( 'VS_VERSION_INFO VERSIONINFO' )
oRC:Add( saDatVers["Version"] )
oRC:Add( 'FILEFLAGSMASK 0x3F' )
oRC:Add( 'FILEFLAGS 0x0' )
oRC:Add( 'FILEOS VOS__WINDOWS32' )
oRC:Add( 'FILETYPE VFT_APP' )
oRC:Add( 'FILESUBTYPE VFT2_UNKNOWN'+CRLF )
oRC:Add( 'BEGIN' )
oRC:Add( ' BLOCK "StringFileInfo"' )
oRC:Add( ' BEGIN' )
oRC:Add( ' BLOCK "040904B0"' )
oRC:Add( ' BEGIN' )
oRC:Add( ' VALUE "Author", "Ing. Mario González\000"' ) // En la aplicación estos datos se recuperan con
oRC:Add( ' VALUE "CompanyName", "Ideas & Desarrollos\000"' ) // GetFileVersionInfo() - yo lo tengo en un fuente
oRC:Add( ' VALUE "FileVersion", ' +saDatVers["FileVersion" ] ) // con referencia como de autor anónimo
oRC:Add( ' VALUE "FileDescription", ' +saDatVers["FileDescription" ] )
oRC:Add( ' VALUE "InternalName", ' +saDatVers["InternalName" ] )
oRC:Add( ' VALUE "LegalCopyright", ' +saDatVers["LegalCopyright" ] )
oRC:Add( ' VALUE "ProductName", ' +saDatVers["ProductName" ] )
oRC:Add( ' VALUE "ProductVersion", ' +saDatVers["ProductVersion" ] )
oRC:Add( ' VALUE "OriginalFilename", '+saDatVers["OriginalFilename"] )
oRC:Add( ' VALUE "SpecialBuild","Enlazado con xHarbour 1.2.1 Lic. GNU\000"' )
oRC:Add( ' END' )
oRC:Add( ' END'+CRLF )
oRC:Add( ' BLOCK "VarFileInfo"' )
oRC:Add( ' BEGIN' )
oRC:Add( ' VALUE "Translation", 0x409, 0x4B0' )
oRC:Add( ' END' )
oRC:Add( 'END' )
else
MsgAlert( "No se pudo crear "+cArchRC, "Atención" )
end
else
oRC:= TTxtFile():New( cArchRC )
oRC:GoTo( 10 )
oRC:RepLine( saDatVers["Version"] )
oRC:GoTo( 23 )
oRC:RepLine( ' VALUE "FileVersion", ' +saDatVers["FileVersion" ] )
oRC:GoTo( 24 )
oRC:RepLine( ' VALUE "FileDescription", ' +saDatVers["FileDescription" ] )
oRC:GoTo( 25 )
oRC:RepLine( ' VALUE "InternalName", ' +saDatVers["InternalName" ] )
oRC:GoTo( 26 )
oRC:RepLine( ' VALUE "LegalCopyright", ' +saDatVers["LegalCopyright" ] )
oRC:GoTo( 27 )
oRC:RepLine( ' VALUE "ProductName", ' +saDatVers["ProductName" ] )
oRC:GoTo( 28 )
oRC:RepLine( ' VALUE "ProductVersion", ' +saDatVers["ProductVersion" ] )
oRC:GoTo( 29 )
oRC:RepLine( ' VALUE "OriginalFilename", '+saDatVers["OriginalFilename"] )
end
oRC:Close()
// Fin
// ------------------------------------------------------------------------- \\
// Archivo log
//
PROCEDURE SetLog()
local oLog, ;
cArchLog:= scPathDB+"GenBuild.log", ;
nX
if !File( cArchLog )
saHeader[4]:= " Archivo...: registro de builds"
oLog:= TTxtFile():New( cArchLog )
if oLog:Open()
for nX:= 1 to Len( saHeader )
oLog:Add( saHeader[nX] )
next
oLog:Add( CRLF + ;
"Build "+ ;
"{ " + ;
Str( snBldNumber,,, .T. ) + ", " + ;
"'" + DtoC( Date() ) + "'" + ", " + ;
"'" + Time() + "'" + ;
" }" )
else
MsgAlert( "No se pudo crear "+cArchLog, "Atención" )
end
else
oLog:= TTxtFile():New( cArchLog )
oLog:GoTo( 8 )
oLog:InsLine( "Build " + ;
"{ " + ;
Str( snBldNumber,,, .T. ) + ", " + ;
"'" + DtoC( Date() ) + "'" + ", " + ;
"'" + Time() + "'" + ;
" }" )
end
oLog:Close()
// Fin