[OT] Automatizar número de build
- José Luis Sánchez
- Posts: 556
- Joined: Thu Oct 13, 2005 9:23 am
- Location: Novelda - Alicante - España
- Contact:
[OT] Automatizar número de build
Hola,
Estaba viendo un editor que me gusta mucho y en el 'acerca de' decía build 2139.
Me pregunto si hay alguna manera de automatizar el número de build de una aplicación, de manera que el propio make lleve la cuenta de cuantas veces hemos compilado los fuentes. Estoy dándole vueltas a la cabeza y no encuentro la manera, se me ocurre la manera de hacerlo a través de un ini, pero no dentro del propio exe, que es como me gustaría.
Saludos,
José Luis
Estaba viendo un editor que me gusta mucho y en el 'acerca de' decía build 2139.
Me pregunto si hay alguna manera de automatizar el número de build de una aplicación, de manera que el propio make lleve la cuenta de cuantas veces hemos compilado los fuentes. Estoy dándole vueltas a la cabeza y no encuentro la manera, se me ocurre la manera de hacerlo a través de un ini, pero no dentro del propio exe, que es como me gustaría.
Saludos,
José Luis
Re: [OT] Automatizar número de build
Hola Jose:
Colocar el numero de Build en el EXE creo que es difícil automatizarlo.
Yo lo hago a través del creador de instaladores InnoSetup
- El numero de Build es la fecha de la compilación
- El innoSetup puede ver la fecha del EXE y crear un instalador con esa fecha
- Al ejecuta el instalador creado por el innoSetup, este coloca en el INI de la aplicación el número Build
- La aplicación lee del INI el numero de Build
- OJO: Cada vez que creo un instalador se crea una versión
Parte del ini seria
- De esta forma le puedo preguntar al usuario que numero de Build esta usando
En mi pagina puedes ver los algunos instaladores y sus numero de "versión" http://sauro-sys.com/node/3
Atentamente,
Rolando
Desde Cochabamba, Bolivia.
Colocar el numero de Build en el EXE creo que es difícil automatizarlo.
Yo lo hago a través del creador de instaladores InnoSetup
- El numero de Build es la fecha de la compilación
- El innoSetup puede ver la fecha del EXE y crear un instalador con esa fecha
- Al ejecuta el instalador creado por el innoSetup, este coloca en el INI de la aplicación el número Build
- La aplicación lee del INI el numero de Build
- OJO: Cada vez que creo un instalador se crea una versión
Parte del ini seria
Code: Select all | Expand
[Version]
Ejecutable=20111002
Dictionary=
- De esta forma le puedo preguntar al usuario que numero de Build esta usando
En mi pagina puedes ver los algunos instaladores y sus numero de "versión" http://sauro-sys.com/node/3
Atentamente,
Rolando
Desde Cochabamba, Bolivia.
- Raymundo Islas M.
- Posts: 592
- Joined: Tue Mar 14, 2006 11:34 pm
- Location: Acapulco, Gro. MEXICO
Re: [OT] Automatizar número de build
Jose Luis, Rolando :
Realmente no es dificil anexar/integrar el build de nuestra aplicacion directamente en el propio ejecutable
![Image](http://img100.imageshack.us/img100/4774/buildcontrol.jpg)
En mi caso yo manejo 2 datos : Build y Control
Build : Por cada vez que compilo los fuentes, voy incrementando su valor.
Control : Por cade vez que compilo los fuentes, me toma fecha y hora.
Lo que hago es lo siguiente :
- Crea un archivo .prg con una funcion que retorne el Build/Control como cadena(s)
- Crea tu funcion que te genere y actualize tu nuevo Build/Control
- En la misma funcion borras el archivo .prg
- Y enseguida que genere el nuevo archivo .prg con los nuevos valores
Asi, en cada compilacion el programa toma los valores generados previamente.
Suena un poco confuso, pero me funciona al 100%
De hecho, este principio lo podemos usar para manejar varias cosillas mas en nuestras apps.
Saludos
Realmente no es dificil anexar/integrar el build de nuestra aplicacion directamente en el propio ejecutable
![Twisted Evil :twisted:](./images/smilies/icon_twisted.gif)
![Image](http://img100.imageshack.us/img100/4774/buildcontrol.jpg)
En mi caso yo manejo 2 datos : Build y Control
Build : Por cada vez que compilo los fuentes, voy incrementando su valor.
Control : Por cade vez que compilo los fuentes, me toma fecha y hora.
Lo que hago es lo siguiente :
- Crea un archivo .prg con una funcion que retorne el Build/Control como cadena(s)
- Crea tu funcion que te genere y actualize tu nuevo Build/Control
- En la misma funcion borras el archivo .prg
- Y enseguida que genere el nuevo archivo .prg con los nuevos valores
Asi, en cada compilacion el programa toma los valores generados previamente.
Suena un poco confuso, pero me funciona al 100%
De hecho, este principio lo podemos usar para manejar varias cosillas mas en nuestras apps.
Saludos
FWH 10.6 + xHarbour + Borland 582
Re: [OT] Automatizar número de build
RSalazarU wrote:Hola Jose:
Colocar el numero de Build en el EXE creo que es difícil automatizarlo.
Yo lo hago a través del creador de instaladores InnoSetup
- El numero de Build es la fecha de la compilación
- El innoSetup puede ver la fecha del EXE y crear un instalador con esa fecha
- Al ejecuta el instalador creado por el innoSetup, este coloca en el INI de la aplicación el número Build
- La aplicación lee del INI el numero de Build
- OJO: Cada vez que creo un instalador se crea una versión
Parte del ini seriaCode: Select all | Expand
[Version]
Ejecutable=20111002
Dictionary=
- De esta forma le puedo preguntar al usuario que numero de Build esta usando
En mi pagina puedes ver los algunos instaladores y sus numero de "versión" http://sauro-sys.com/node/3
Atentamente,
Rolando
Desde Cochabamba, Bolivia.
Buenos días Rolando,
Podrías compartir tu fichero ISS de Inno Setup para ver como realizas este proceso?
Gracias
Un Saludo
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Re: [OT] Automatizar número de build
Jose Luis,
Creo que este codigo puede servir para lo que quieres; esta sin testear;
el unico inconveniente que le veo, pero es solucionable, es que las compilaciones con errores
tambien "suman" al contador de builds; para mi eso es correcto, pero entiendo que otras personas
no lo entiendan asi.
Saludos
Creo que este codigo puede servir para lo que quieres; esta sin testear;
el unico inconveniente que le veo, pero es solucionable, es que las compilaciones con errores
tambien "suman" al contador de builds; para mi eso es correcto, pero entiendo que otras personas
no lo entiendan asi.
Code: Select all | Expand
/*
GenBuild.Prg
Generacion de ExeBuild.Prg
La primera vez la secuencia de creacion es:
GenBuild.Prg-> GenBuild.Exe -> ExeBuild.Prg
Funcionamiento:
- En nuestro proyecto (.mak o similar) se a¤ade un .prg
a la lista llamado ExeBuild.Prg
- Se crea un GenBuild.Exe a partir de GenBuild.Prg
- GenBuild.Exe debe ejecutarse antes de compilar: o bien
se inserta en la ejecucion del make, o bien se inserta
a un .bat que llama primero al GenBuild.Exe y luego al
Make.Exe
Posibles mejoras:
- Cuando varios proyectos en misma carpeta, posibilidad de
recibir un parametro con el nombre del exe o proyecto
y añadir (automaticamente) a ExeBuild.Dbf una linea
por cada exe o proyecto.
*/
FUNCTION GenBuild()
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild
IF !File("ExeBuild.Dbf")
dbCreate("ExeBuild.Dbf",;
{;
{"BuildNumbe", "N", 9, 0};
})
SELECT 0
USE ExeBuild
Add_Rec(0)
ELSE
SELECT 0
USE ExeBuild
ENDIF
RLock()
nBuildNumber:= BuildNumbe+ 1
REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT
CLOSE ExeBuild
caExeBuild:= "{"+;
LTrim(Str(nBuildNumber, 9, 0))+ ","+;
DToC(dBuildNumber)+ ","+;
cBuildTime;
"}"
cExeBuild:= ;
"/* "+;
" ExeBuild.Prg "+;
" "+;
" Devuelve Numero, Fecha y hora del Build "+; "
" "+;
" Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) "+;
" En el proyecto (.mak) ha incluirse una mencion a "+;
" ExeBuild.Prg "+;
" "+;
"*/ "+;
" "+;
"FUNCTION ExeBuild() "+;
" "+;
"RETURN "+ caExeBuild+ " "+;
""
MemoWrite("ExeBuild", cExeBuild)
// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
hLog:= FCreate("LogBuild.Txt")
FWrite(hLog, "Log de builds")
FWrite(hLog, "-------------")
ELSE
hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)
RETURN NIL
Saludos
Re: [OT] Automatizar número de build
Code: Select all | Expand
/*
Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
=====================================================================
GenBuild.Prg
Generacion de aExeBuild.Prg // CGP
La primera vez la secuencia de creacion es:
GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg // CGP
Funcionamiento:
- En nuestro proyecto (.mak o similar) se a¤ade un .prg
a la lista llamado aExeBuild.Prg // CGP
- Se crea un GenBuild.Exe a partir de GenBuild.Prg
- GenBuild.Exe debe ejecutarse antes de compilar: o bien
se inserta en la ejecucion del make, o bien se inserta
a un .bat que llama primero al GenBuild.Exe y luego al
Make.Exe
Posibles mejoras:
- Cuando varios proyectos en misma carpeta, posibilidad de
recibir un parametro con el nombre del exe o proyecto
y añadir (automaticamente) a ExeBuild.Dbf una linea
por cada exe o proyecto.
*/
FUNCTION GenBuild( nBuild, cPathPRG )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild
IF !File("ExeBuild.Dbf")
dbCreate("ExeBuild.Dbf",;
{;
{"BuildNumbe", "N", 9, 0};
})
SELECT 0
USE ExeBuild
Add_Rec(0)
ELSE
SELECT 0
USE ExeBuild
ENDIF
RLock()
nBuildNumber:= BuildNumbe + 1
//// CGP
If nBuild > 0
nBuildNumber:= nBuild
EndIf
//// CGP
REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT
CLOSE ExeBuild
caExeBuild:= "{" + ;
LTrim( Str( nBuildNumber, 9, 0) ) + "," + ;
DToC( dBuildNumber ) + "," + ;
cBuildTime;
"}"
cExeBuild:= ;
"/* " + Chr(13)+Chr(10) + ; // CGP
" aExeBuild.Prg " + Chr(13)+Chr(10) + ;
" " + Chr(13)+Chr(10) + ;
" Devuelve Array de Numero, Fecha y hora del Build " + Chr(13)+Chr(10) + ; // CGP
" " + Chr(13)+Chr(10) + ;
" Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + Chr(13)+Chr(10) + ;
" En el proyecto (.mak) ha incluirse una mencion a " + Chr(13)+Chr(10) + ;
" aExeBuild.Prg " + Chr(13)+Chr(10) + ; // CGP
" " + Chr(13)+Chr(10) + ;
"*/ " + Chr(13)+Chr(10) + ;
" " + Chr(13)+Chr(10) + ;
"FUNCTION aExeBuild() " + Chr(13)+Chr(10) + ; // CGP
" " + Chr(13)+Chr(10) + ;
"RETURN " + caExeBuild + Chr(13)+Chr(10) + ;
""
MemoWrite( cPathPRG + "aExeBuild" + ".PRG", cExeBuild) // CGP
// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
hLog:= FCreate("LogBuild.Txt")
FWrite(hLog, "Log de builds")
FWrite(hLog, "-------------")
ELSE
hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)
RETURN NIL
Hola hmpaquito,
He añadido alguna mejora; estan marcadas con // CGP.
-Añadido parámetro a GenBuild() para forzar un nBuild concreto.
-añadido parámetro a GenBuild() para indicar donde crear el PRG.
-Añadido salto de línea en la creación del PRG.
-Cambiado el nombre de ExeBuild() a aExeBuild(), ya que devuelve un Array.
-Añadido PRG al final del nombre del fichero creado.
Me gusta la idea, la usaré enseguida que pueda.
Gracias.
Un Saludo
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Re: [OT] Automatizar número de build
FiveWidi,
Buenas correcciones...
Lo de modificar el nombre del ejecutable o de la funcion: solo por hablar de algo: Algunos nombre de funcion las prefijo con el tipo que devolveran y en otros casos no. Imaginate que decidimos mañana que aExeBuild() devuelva un objeto, por ejemplo de la clase TPublic, con datas ¿ Tenemos entonces que renombrar la clase y pasearnos por todos los puntos donde la utilizamos y llamarla oExeBuild ? En general, a no ser que este mas o menos seguro de que el tipo a devolver no cambiara, no le pongo el tipo para evitar este inconveniente.
Te dejo una copia con algunas modificaciones que vienen con // PAQ
Buenas correcciones...
Lo de modificar el nombre del ejecutable o de la funcion: solo por hablar de algo: Algunos nombre de funcion las prefijo con el tipo que devolveran y en otros casos no. Imaginate que decidimos mañana que aExeBuild() devuelva un objeto, por ejemplo de la clase TPublic, con datas ¿ Tenemos entonces que renombrar la clase y pasearnos por todos los puntos donde la utilizamos y llamarla oExeBuild ? En general, a no ser que este mas o menos seguro de que el tipo a devolver no cambiara, no le pongo el tipo para evitar este inconveniente.
Te dejo una copia con algunas modificaciones que vienen con // PAQ
Code: Select all | Expand
/*
Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
=====================================================================
GenBuild.Prg
Generacion de aExeBuild.Prg // CGP
La primera vez la secuencia de creacion es:
GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg // CGP
Funcionamiento:
- En nuestro proyecto (.mak o similar) se a¤ade un .prg
a la lista llamado aExeBuild.Prg // CGP
- Se crea un GenBuild.Exe a partir de GenBuild.Prg
- GenBuild.Exe debe ejecutarse antes de compilar: o bien
se inserta en la ejecucion del make, o bien se inserta
a un .bat que llama primero al GenBuild.Exe y luego al
Make.Exe
Posibles mejoras:
- Cuando varios proyectos en misma carpeta, posibilidad de
recibir un parametro con el nombre del exe o proyecto
y añadir (automaticamente) a ExeBuild.Dbf una linea
por cada exe o proyecto.
*/
#Define CRLF Chr(13)+ Chr(130) // PAQ
FUNCTION GenBuild( nBuildPar, cPathPrg )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild
IF cPathPrg == NIL // PAQ
cPathPrg:= ""
ENDIF
IF nBuild == NIL // PAQ Cuando parametro build entonces no graba en automatico
IF !File("ExeBuild.Dbf")
dbCreate("ExeBuild.Dbf",;
{;
{"BuildNumbe", "N", 9, 0};
})
SELECT 0
USE ExeBuild
Add_Rec(0)
ELSE
SELECT 0
USE ExeBuild
ENDIF
RLock()
nBuildNumber:= BuildNumbe + 1
//// CGP
// If nBuild > 0
// nBuildNumber:= nBuild
//EndIf
////// CGP
REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT
CLOSE ExeBuild
ELSE
nBuildNumber:= nBuildPar
ENDIF
caExeBuild:= "{" + ;
LTrim( Str( nBuildNumber, 9, 0) ) + "," + ;
DToC( dBuildNumber ) + "," + ;
cBuildTime;
"}"
cExeBuild:= ;
"/* " + CRLF+;
" aExeBuild.Prg " + CRLF+;
" " + CRLF+;
" Devuelve Array de Numero, Fecha y hora del Build " + CRLF+;
" " + CRLF+;
" Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + CRLF+;
" En el proyecto (.mak) ha incluirse una mencion a " + CRLF+;
" aExeBuild.Prg " + CRLF+;
" " + CRLF+;
"*/ " + CRLF+;
" " + CRLF+;
"FUNCTION aExeBuild() " + CRLF+;
" " + CRLF+;
"RETURN " + caExeBuild + CRLF+;
""
MemoWrite( cPathPRG + "aExeBuild" + ".PRG", cExeBuild) // CGP
// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
hLog:= FCreate("LogBuild.Txt")
FWrite(hLog, "Log de builds")
FWrite(hLog, "-------------")
ELSE
hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)
RETURN NIL
Re: [OT] Automatizar número de build
Hola Jose:
Te paso un fichero completo ISS
Atentamente,
Rolando
Desde Cochabamba, Bolivia.
Te paso un fichero completo ISS
Code: Select all | Expand
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define DateExeFile GetFileDateTimeString('.\ChqueraXH32.exe', 'yymmdd', '_',':')
#define DateDictFile GetFileDateTimeString('.\Dictionary\Dictionary.add', 'yymmdd', '_',':')
[Setup]
AppName=ChqueraXH32
AppVerName=ChqueraXH32 1.5
DefaultDirName={pf}\SAURO\ChqueraXH32
DefaultGroupName=SAURO\ChqueraXH32
OutputDir=.\Instalar
OutputBaseFilename=SetupChqueraXH32_v.{#DateExeFile}.{#DateDictFile}
SetupIconFile=.\Icons\Boligrafo.ico
VersionInfoVersion=1
VersionInfoTextVersion=v.{#DateExeFile}.{#DateDictFile}
AppPublisher=Sauro Srl.
AppPublisherURL=http://www.sauro-sys.com/
AppSupportURL=http://www.sauro-sys.com/
AppUpdatesURL=http://www.sauro-sys.com/
VersionInfoCompany=SAURO SOFTWARE SRL.
VersionInfoCopyright=SAURO SOFTWARE
WizardImageFile=E:\Archivos de programa\Inno Setup 5\WizModernImage-IS.bmp
WizardSmallImageFile=E:\Archivos de programa\Inno Setup 5\WizModernSmallImage-IS.bmp
InternalCompressLevel=max
Compression=lzma/Max
SolidCompression=true
AllowNoIcons=true
WindowVisible=false
PrivilegesRequired=admin
[Messages]
AdminPrivilegesRequired=Este proceso requiere privilegiso de administrador.
[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons};
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons};
[Files]
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: ChqueraXH32.exe; DestDir: {app}
Source: ChqueraXH32.dll; DestDir: {app}; Flags: ignoreversion
Source: Recursos.dll; DestDir: {app}; Flags: ignoreversion
Source: ..\..\DLL\Mnto32.dll; DestDir: {app}; Flags: ignoreversion
Source: ..\..\DLL\Common.dll; DestDir: {app}; Flags: ignoreversion
Source: ..\..\DLL\User.dll; DestDir: {app}; Flags: ignoreversion
Source: Program.ch; DestDir: {app}; Flags: ignoreversion
Source: Chquera.ch; DestDir: {app}; Flags: ignoreversion
Source: ..\ContXH32\Contabilidad.ch; DestDir: {app}; Flags: ignoreversion
Source: ..\FIVEGEN\SYSTEM.ch; DestDir: {app}; Flags: ignoreversion
Source: whatsnew.txt; DestDir: {app}; Flags: ignoreversion
Source: DICTIONARY\*.dbf; DestDir: {app}\Dictionary; Excludes: ~*.*,DBName*.*,*.ADD,*.AI,*.AM; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\*.cdx; DestDir: {app}\Dictionary; Excludes: ~*.*,DBName*.*,*.ADD,*.AI,*.AM; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\*.fpt; DestDir: {app}\Dictionary; Excludes: ~*.*,DBName*.*,*.ADD,*.AI,*.AM; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\DICTIONARY.ADD; DestDir: {app}\Dictionary; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\DICTIONARY.AI; DestDir: {app}\Dictionary; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\DICTIONARY.AM; DestDir: {app}\Dictionary; Flags: ignoreversion; Tasks: ; Languages:
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Axcws32.dll; DestDir: {app}; Flags: promptifolder
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Adsloc32.dll; DestDir: {app}; Flags: promptifolder
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Ace32.dll; DestDir: {app}; Flags: promptifolder
;Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Adslocal.cfg; DestDir: {app}; Flags: promptifolder
Source: ..\..\CFG\Adslocal.cfg; DestDir: {app}; Flags: promptifolder; DestName: Adslocal.cfg
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\ansi.chr; DestDir: {app}; Flags: promptifolder
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\extend.chr; DestDir: {app}; Flags: promptifolder
;Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Ads.ini; DestDir: {app}; Flags: ignoreversion onlyifdoesntexist
Source: ..\..\CFG\Ads.ini; DestDir: {app}; Flags: ignoreversion promptifolder;
[Icons]
Name: {group}\ChqueraXH32; Filename: {app}\ChqueraXH32.exe; WorkingDir: {app}; IconIndex: 0
Name: {group}\{cm:UninstallProgram,ChqueraXH32}; Filename: {uninstallexe}
Name: {userdesktop}\ChqueraXH32; Filename: {app}\ChqueraXH32.exe; Tasks: desktopicon; WorkingDir: {app}; IconIndex: 0
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\ChqueraXH32; Filename: {app}\ChqueraXH32.exe; Tasks: quicklaunchicon; WorkingDir: {app}; IconIndex: 0
[Run]
Filename: {app}\ChqueraXH32.exe; Description: {cm:LaunchProgram,ChqueraXH32}; Flags: nowait postinstall skipifsilent
Filename: {app}\whatsnew.txt; Description: Ver que hay de nuevo; Flags: postinstall shellexec skipifsilent
[INI]
Filename: {app}\ChqueraXH32.ini; Section: SYSTEM; Key: WND_MDI; String: .F.
Filename: {app}\ChqueraXH32.ini; Section: SYSTEM; Key: OUTLOOK2003; String: .T.
Filename: {app}\ChqueraXH32.ini; Section: Version; Key: Ejecutable; String: {#DateExeFile}
Filename: {app}\ChqueraXH32.ini; Section: Version; Key: Dictionary; String: {#DateDictFile}
[Registry]
Root: HKLM; Subkey: SOFTWARE\SAURO\FIVEWIN\ChqueraXH32; ValueType: string; ValueData: ChqueraXH32
Root: HKLM; Subkey: SOFTWARE\SAURO\FIVEWIN\ChqueraXH32; ValueType: string; ValueName: Fecha registro; ValueData: code:GetDateInstall( ); Flags: createvalueifdoesntexist
[Code]
function GetDateInstall( ): String;
begin
Result := GetDateTimeString('yymmdd', '_',':');
end;
Atentamente,
Rolando
Desde Cochabamba, Bolivia.
Re: [OT] Automatizar número de build
hmpaquito wrote:FiveWidi,
Buenas correcciones...
Lo de modificar el nombre del ejecutable o de la funcion: solo por hablar de algo: Algunos nombre de funcion las prefijo con el tipo que devolveran y en otros casos no. Imaginate que decidimos mañana que aExeBuild() devuelva un objeto, por ejemplo de la clase TPublic, con datas ¿ Tenemos entonces que renombrar la clase y pasearnos por todos los puntos donde la utilizamos y llamarla oExeBuild ? En general, a no ser que este mas o menos seguro de que el tipo a devolver no cambiara, no le pongo el tipo para evitar este inconveniente.
Te dejo una copia con algunas modificaciones que vienen con // PAQCode: Select all | Expand
/*
Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
=====================================================================
GenBuild.Prg
Generacion de aExeBuild.Prg // CGP
La primera vez la secuencia de creacion es:
GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg // CGP
Funcionamiento:
- En nuestro proyecto (.mak o similar) se a¤ade un .prg
a la lista llamado aExeBuild.Prg // CGP
- Se crea un GenBuild.Exe a partir de GenBuild.Prg
- GenBuild.Exe debe ejecutarse antes de compilar: o bien
se inserta en la ejecucion del make, o bien se inserta
a un .bat que llama primero al GenBuild.Exe y luego al
Make.Exe
Posibles mejoras:
- Cuando varios proyectos en misma carpeta, posibilidad de
recibir un parametro con el nombre del exe o proyecto
y añadir (automaticamente) a ExeBuild.Dbf una linea
por cada exe o proyecto.
*/
#Define CRLF Chr(13)+ Chr(130) // PAQ
FUNCTION GenBuild( nBuildPar, cPathPrg )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild
IF cPathPrg == NIL // PAQ
cPathPrg:= ""
ENDIF
IF nBuild == NIL // PAQ Cuando parametro build entonces no graba en automatico
IF !File("ExeBuild.Dbf")
dbCreate("ExeBuild.Dbf",;
{;
{"BuildNumbe", "N", 9, 0};
})
SELECT 0
USE ExeBuild
Add_Rec(0)
ELSE
SELECT 0
USE ExeBuild
ENDIF
RLock()
nBuildNumber:= BuildNumbe + 1
//// CGP
// If nBuild > 0
// nBuildNumber:= nBuild
//EndIf
////// CGP
REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT
CLOSE ExeBuild
ELSE
nBuildNumber:= nBuildPar
ENDIF
caExeBuild:= "{" + ;
LTrim( Str( nBuildNumber, 9, 0) ) + "," + ;
DToC( dBuildNumber ) + "," + ;
cBuildTime;
"}"
cExeBuild:= ;
"/* " + CRLF+;
" aExeBuild.Prg " + CRLF+;
" " + CRLF+;
" Devuelve Array de Numero, Fecha y hora del Build " + CRLF+;
" " + CRLF+;
" Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + CRLF+;
" En el proyecto (.mak) ha incluirse una mencion a " + CRLF+;
" aExeBuild.Prg " + CRLF+;
" " + CRLF+;
"*/ " + CRLF+;
" " + CRLF+;
"FUNCTION aExeBuild() " + CRLF+;
" " + CRLF+;
"RETURN " + caExeBuild + CRLF+;
""
MemoWrite( cPathPRG + "aExeBuild" + ".PRG", cExeBuild) // CGP
// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
hLog:= FCreate("LogBuild.Txt")
FWrite(hLog, "Log de builds")
FWrite(hLog, "-------------")
ELSE
hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)
RETURN NIL
Me sigue gustando.
Gracias.
Un Saludo
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Re: [OT] Automatizar número de build
Hola,
Por favor, añadir al .rc
Por favor, añadir al .rc
Code: Select all | Expand
1 VERSIONINFO LOADONCALL MOVEABLE
FILEVERSION 2012, 0, 0, 0
PRODUCTVERSION 2012, 0, 0, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
{
BLOCK "StringFileInfo"
{
BLOCK "040904b0"
{
VALUE "CompanyName", "http://www.myweb.pt/\000"
VALUE "FileDescription", "Test sample\000"
VALUE "FileVersion", "2012\000"
VALUE "LegalCopyright", "(c) Me\000"
VALUE "LegalTrademarks", "(c) Me\000"
VALUE "ProductName", "Flota\000"
VALUE "ProductVersion", "2012\000"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 1033, 1200
}
}
Re: [OT] Automatizar número de build
Code: Select all | Expand
/* Aquí empieza el programa principal.
----------------------------------*/
FUNCTION MAIN()
local programa := "Genbuild.PRG"
GenBuild( Arg( 1 ), Arg( 2 ) )
Return Nil
// Fi de la funció d'arrancada.
/* ************************************************************************************************* */
/* ************************************************************************************************* */
/*
Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
=====================================================================
GenBuild.Prg
Generacion de aExeBuild.Prg // CGP
La primera vez la secuencia de creacion es:
GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg // CGP
Funcionamiento:
- En nuestro proyecto (.mak o similar) se a¤ade un .prg
a la lista llamado aExeBuild.Prg // CGP
- Se crea un GenBuild.Exe a partir de GenBuild.Prg
- GenBuild.Exe debe ejecutarse antes de compilar: o bien
se inserta en la ejecucion del make, o bien se inserta
a un .bat que llama primero al GenBuild.Exe y luego al
Make.Exe
Posibles mejoras:
- Cuando varios proyectos en misma carpeta, posibilidad de
recibir un parametro con el nombre del exe o proyecto
y añadir (automaticamente) a ExeBuild.Dbf una linea
por cada exe o proyecto.
Ejemplo de uso en el BAT de compilación de la aplicación AMPA1011:
c:\desarrol\utilidad\Genbuild 0 c:\desarrol\trabajo\AMPA1011\PRG\Arquitec\
*/
#Define CRLF Chr(13)+Chr(10) // PAQ
FUNCTION GenBuild( nBuildPar, cPathPrg )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild
IF nBuildPar == NIL .or. nBuildPar = "" // CGP
nBuildPar := 0
EndIf
IF cPathPrg == NIL // PAQ
cPathPrg := ""
ENDIF
IF nBuildPar = 0 // == NIL // PAQ Cuando parametro build entonces no graba en automatico // CGP
IF !File("ExeBuild.Dbf")
dbCreate("ExeBuild.Dbf",;
{;
{"BuildNumbe", "N", 9, 0};
})
SELECT 0
USE ExeBuild
//Add_Rec(0) // CGP
Append Blank // CGP
ELSE
SELECT 0
USE ExeBuild
ENDIF
RLock()
nBuildNumber:= ExeBuild->BuildNumbe + 1 // CGP
REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT
CLOSE ExeBuild
ELSE
nBuildNumber:= nBuildPar
ENDIF
////// CGP
caExeBuild:= "{ " + ;
LTrim( Str( nBuildNumber, 9, 0) ) + ", " + ;
"'" + DToS( dBuildNumber ) + "', " + ;
"'" + cBuildTime + "'" + ;
" }"
cExeBuild:= ;
"/* " + CRLF+;
" aExeBuild.Prg " + CRLF+;
" " + CRLF+;
" Devuelve 3 datos del build en una Array con: " + CRLF+;
" Numero (tipo entero, ej. 5) " + CRLF+;
" Fecha (tipo cadena AAAAMMDD, ej. '20120325' ) " + CRLF+;
" hora (tipo cadena HHMMSS, ej. '16:43:51') " + CRLF+;
" " + CRLF+;
" Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + CRLF+;
" En el proyecto (.mak) ha incluirse una mencion a " + CRLF+;
" aExeBuild.Prg " + CRLF+;
" " + CRLF+;
"*/ " + CRLF+;
" " + CRLF+;
"FUNCTION aExeBuild()" + CRLF+;
"RETURN " + caExeBuild + CRLF+;
"/* */"
MemoWrit( cPathPRG + "aExeBuild" + ".PRG", cExeBuild ) // CGP
// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
hLog:= FCreate("LogBuild.Txt")
FWrite(hLog, "Log de builds" + CRLF ) // CGP
FWrite(hLog, "-------------" + CRLF ) // CGP
ELSE
hLog:= FOpen("LogBuild.Txt", 1) // CGP
ENDIF
FSeek(hLog, 0, 2) // CGP
FWrite(hLog, "Build "+ caExeBuild + CRLF ) // CGP
FClose(hLog)
RETURN NIL
Ahora incluso compila y funciona.
Faltaban algunos detalles que impedían su compilación.
Además la fecha que devuelve es una cadena formato AAAAMMDD para así evitar que el formato de fecha afecte la respuesta.
Ahora me gusta más.
Gracias.
Un Saludo
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
- MarioG
- Posts: 1380
- Joined: Fri Oct 14, 2005 1:28 pm
- Location: Resistencia - Chaco - AR
- Been thanked: 2 times
Re: [OT] Automatizar número de build
Gente:
Dejo otra alternativa. Difiere de la de fivewidi en que genera/mantiene el archivo .rc que se incrusta en la aplicación
Saludos
Dejo otra alternativa. Difiere de la de fivewidi en que genera/mantiene el archivo .rc que se incrusta en la aplicación
Code: Select all | Expand
/***************
Prog : GenBuild.prg
Autor : eMeGe
Módulo : unico
Inicio : 16/02/2012
Liberado : 22/02/2012
Versiones : 1.00 Operable
Idea original en: viewtopic.php?f=6&t=23215#p124598 » 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
Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
Chaco - Argentina
- MarioG
- Posts: 1380
- Joined: Fri Oct 14, 2005 1:28 pm
- Location: Resistencia - Chaco - AR
- Been thanked: 2 times
Re: [OT] Automatizar número de build
Me he dado cuenta que el fuente dejado no es muy practico en la actualización del .rc, ya que solo automatiza el nro. de Build. Si cambiamos de version se debe cambiar en el fuente.
Este código introduce la creación de un archivo .ini que contiene variables que se las cambia editandoló. De manera que el ejecutable ya no necesita cambios
Cualquier mejora es bienvenida
Aclaración: uso funciones xHarbour ( HB_WriteIni() y HB_ReadIni() )
Saludos
Este código introduce la creación de un archivo .ini que contiene variables que se las cambia editandoló. De manera que el ejecutable ya no necesita cambios
Cualquier mejora es bienvenida
Code: Select all | Expand
/***************
Prog : GenBuild.prg
Autor : eMeGe
Módulo : unico
Inicio : 16/02/2012
Liberado : 22/02/2012
Versiones : 1.10 Se introdujo el uso de archivo .ini; el que guarda
variables de la versión que permiten actualizarse
sin necesidad de recompilar el fuente.
1.00 Operable
Idea original en: viewtopic.php?f=6&t=23215#p124598 » 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[ 4 ]
#xtranslate shIni => aStaticsMain\[1\]
#xtranslate saHeader => aStaticsMain\[2\]
#xtranslate scPathDB => aStaticsMain\[3\]
#xtranslate snBldNumber => aStaticsMain\[4\]
PROCEDURE Main()
local cIni:= "DatVersion.ini", ;
hIni, ;
cAnio:= Str( Year(Date()),,,.T.), ;
cAppExe:= Space( 8 )
// Camino
DEFAULT scPathDB:= ".\" // camino de archivos .dbf, .rc, .log
// Genera/Actualiza Build
SetBuild()
// Cabecera
saHeader:= "/*----------------------------------------------------" +CRLF+ ;
" Autor.....: Ing. Mario González" +CRLF+ ;
" Correo-e..: mario.r.gonzalez@gmail.com" +CRLF+ ;
" archivo :" +CRLF+ ;
" COPYRIGHT.: (c) "+cAnio+" Ideas & Desarrollos desde 1989"+CRLF+ ;
"------------------------------------------------------*/"
// datos de la Versión
if !File( scPathDB+cIni )
msgGet( "OBLIGATORIO!", "Nombre de la Aplicación", @cAppExe )
shIni:= Hash()
shIni["MAIN" ]:= Hash() // Obligatorio
shIni["Aplic"]:= Hash()
shIni["Aplic"]["Exe" ]:= AllTrim( cAppExe )
shIni["Aplic"]["AppIcon"]:= 'AppIcon ICON "resbmp/"'
shIni["AppVer"]:= Hash()
shIni["AppVer"]["Version" ]:= 'FILEVERSION 0,0,0,0'
shIni["AppVer"]["FileVersion" ]:= ''
shIni["AppVer"]["FileDescription" ]:= ''
shIni["AppVer"]["InternalName" ]:= ''
shIni["AppVer"]["LegalCopyright" ]:= '"'+cAnio+' © Ideas & Desarrollos\000"'
shIni["AppVer"]["ProductName" ]:= ''
shIni["AppVer"]["ProductVersion" ]:= ''
shIni["AppVer"]["OriginalFilename"]:= ''
HB_WriteIni( scPathDB+cIni, shIni, StrTran( saHeader, " archivo :", " archivo : .ini" ) )
else
shIni := HB_ReadIni( scPathDB+cIni )
shIni["AppVer"]["FileVersion" ] += Str(snBldNumber,,,.T.)+'\000"'
shIni["AppVer"]["ProductVersion" ] += " "+Str(snBldNumber,,,.T.)+')\000"'
end
// Genera/Actualiza .rc
SetRC()
// Genera/Actualiza .log
SetLog()
// Fin
// ------------------------------------------------------------------------- \\
// Establecer próximo Build
//
PROCEDURE SetBuild()
local cDBF:= "BuildNro"
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 .rc de igual nombre al de la aplicación
//
PROCEDURE SetRC()
local oRC, ;
cArchRC:= scPathDB+shIni["Aplic"]["Exe"]+".rc", ;
nX
if !File( cArchRC )
oRC:= TTxtFile():New( cArchRC )
if oRC:Open()
oRC:Add( StrTran( saHeader, " archivo :", " archivo : recursos" ) )
oRC:Add( '1 24 "d:/bat/theme.man"' )
oRC:Add( shIni["Aplic"]["AppIcon"] )
oRC:Add( 'VS_VERSION_INFO VERSIONINFO' )
oRC:Add( shIni["AppVer"]["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"' )
oRC:Add( ' VALUE "CompanyName", "Ideas & Desarrollos\000"' )
oRC:Add( ' VALUE "FileVersion", ' +shIni["AppVer"]["FileVersion" ] )
oRC:Add( ' VALUE "FileDescription", ' +shIni["AppVer"]["FileDescription" ] )
oRC:Add( ' VALUE "InternalName", ' +shIni["AppVer"]["InternalName" ] )
oRC:Add( ' VALUE "LegalCopyright", ' +shIni["AppVer"]["LegalCopyright" ] )
oRC:Add( ' VALUE "ProductName", ' +shIni["AppVer"]["ProductName" ] )
oRC:Add( ' VALUE "ProductVersion", ' +shIni["AppVer"]["ProductVersion" ] )
oRC:Add( ' VALUE "OriginalFilename", '+shIni["AppVer"]["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( 8 )
oRC:RepLine( shIni["Aplic"]["AppIcon"] )
oRC:GoTo( 10 )
oRC:RepLine( shIni["AppVer"]["Version"] )
oRC:GoTo( 24 )
oRC:RepLine( ' VALUE "FileVersion", ' +shIni["AppVer"]["FileVersion" ] )
oRC:GoTo( 25 )
oRC:RepLine( ' VALUE "FileDescription", ' +shIni["AppVer"]["FileDescription" ] )
oRC:GoTo( 26 )
oRC:RepLine( ' VALUE "InternalName", ' +shIni["AppVer"]["InternalName" ] )
oRC:GoTo( 28 )
oRC:RepLine( ' VALUE "ProductName", ' +shIni["AppVer"]["ProductName" ] )
oRC:GoTo( 29 )
oRC:RepLine( ' VALUE "ProductVersion", ' +shIni["AppVer"]["ProductVersion" ] )
oRC:GoTo( 30 )
oRC:RepLine( ' VALUE "OriginalFilename", '+shIni["AppVer"]["OriginalFilename"] )
end
oRC:Close()
// Fin
// ------------------------------------------------------------------------- \\
// Archivo log
//
PROCEDURE SetLog()
local oLog, ;
cArchLog:= scPathDB+"GenBuild.log", ;
nX
if !File( cArchLog )
oLog:= TTxtFile():New( cArchLog )
if oLog:Open()
oLog:Add( StrTran( saHeader, " archivo :", " archivo : registros" ))
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
Aclaración: uso funciones xHarbour ( HB_WriteIni() y HB_ReadIni() )
Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
Chaco - Argentina