Page 1 of 2
consulta función en C
Posted:
Wed Feb 15, 2012 3:48 pm
by lucasdebeltran
Hola,
Estoy probado el sistema de updates automáticas de Bielsys
http://bielsys.blogspot.com/2009/04/act ... ca-de.htmlEl sistema suele funcionar. Siempre baja el .EXE correctamente.
Pero a la hora de renombrar en tiempo de ejecución tmp.exe por el NOMBREDELPROGRAMA.EXE, no siempre funciona.
El código en C es el siguiente:
- Code: Select all Expand view
#include "stdio.h"
#include "windows.h"
int main( int argc, char *argv[])
{
printf("Actualizando el programa. Por favor, espere unos instantes...\n");
Sleep(700);
DeleteFile( argv[1]);
rename( "tmp.exe",argv[1]);
WinExec(argv[1],1);
return EXIT_SUCCESS;
}
Pasa tanto en XP o Windows 7. Y también verifiqué los permisos (Administrador).
¿Alguna idea?.
Muchas gracias compañeros
Re: consulta función en C
Posted:
Wed Feb 15, 2012 5:07 pm
by George
Con el codigo de mas abajo, al inicio de la funcion main(), y un archivo BAT puedes hacer el truco.
- Code: Select all Expand view
cAppliDir := alltrim(curdrive())+":\"+ alltrim(curdir()) /* Directorio donde reside la aplicacion */
cOrigAppli := upper(alltrim(cAppliDir)) + "\YOUR_PROGRAM.EXE" /* Nombre de la aplicacion */
IF upper((alltrim(hb_argv( 0 )))) <> cOrigAppli
msginfo("New software has been downloaded from server." + chr(13) + "Please re-start the program." )
WinExec( "REN_APP.BAT" ) /* Ejecutar el archivo .BAT */
syswait(3)
Fin()
ENDIF
FUNCTION Fin(hDll) /* Cerrar la aplicacion */
SET 3DLOOK OFF
DbCloseAll()
FreeLibrary( hDLL )
ExitProcess()
RETURN TRUE
- Code: Select all Expand view
// REN_APP.BAT - Este es el archivo .BAT
ERASE "YOUR_PROGRAM.EXE"
RENAME "TMP.EXE" "YOUR_PROGRAM.EXE"
Saludos,
George
Re: consulta función en C
Posted:
Wed Feb 15, 2012 5:15 pm
by lucasdebeltran
Hola,
Muchas gracias pero no funciona.
Yo ejecuto demo.exe, llamo al bat y me dice acceso denegado.
La función en c sobreescribe, en tiempo de ejecución, demo.exe, pero no siempre funciona.
Re: consulta función en C
Posted:
Wed Feb 15, 2012 7:39 pm
by George
Lucas,
Trata incluyendo la ruta (path) en el archivo .bat
Saludos,
George
Re: consulta función en C
Posted:
Thu Feb 16, 2012 8:35 am
by hmpaquito
Lucas,
Si no entiendo mal, el problema es borrar/ sobreescribir el .exe en "caliente". Siempre he tenido auténticos problemas con ese tema. En algunos sistemas funciona: Novel, en otros a veces o según yo qué sé: Windows. Entiendo que esto no tiene una solución directa, aunque si una indirecta.
Saludos
Re: consulta función en C
Posted:
Thu Feb 16, 2012 8:53 am
by Biel EA6DD
El problema puede que se deba a que la aplicación que vas a borrar, todavia está activa. Prueba a incrementar el tiempo de espera antes de borrar(sleep).
Re: consulta función en C
Posted:
Thu Feb 16, 2012 10:10 am
by lucasdebeltran
Muchas gracias Biel.
Y nuevamente gracias por compartir tus aportes en tu blog.
¿Tu no has experimentado este problema?.
Re: consulta función en C
Posted:
Thu Feb 16, 2012 11:40 am
by Biel EA6DD
Hola Lucas,
yo no he detectado problemas, pero tal cual esta programada la función podria dar ese problema, y ademas ser aleatorio dependiendo de si le da tiempo o no a terminar la aplicacíón.
La función en C es tremendamente sencilla y así queria que fuese para no ocupar mucho espacio al embeberla en nuestro programa, en cualquier caso se le puede hacer un pequeó añadido para que chequee si el programa que quieres eliminar esta en memória.
No lo tengo hecho, pero basicamente se trataria de crear un mutex con CreateMutex(NULL, TRUE ,"path/aplicaci.exe"), y comprobar GetLastError(), si es igual a ERROR_ALREADY_EXISTS, la aplicación todavia esta activa.
Re: consulta función en C
Posted:
Thu Feb 16, 2012 11:51 am
by lucasdebeltran
Hola Biel,
Muchas gracias nuevamente por contestar. Yo de C no tengo ni idea.
Segun veo, sleep() equivale a inkey().
La función en C hace:
Sleep(700); -> inkey(x segundos)
DeleteFile( argv[1]); ->borra el exe de la aplicación
rename( "tmp.exe",argv[1]); ->renombra tmp.exe al exe de la aplicación
WinExec(argv[1],1); -> ejecuta de nuevo la aplicación
Pero, ¿dónde está la función que fuerza a salir de la aplicación?.
Muchas gracias y perdona las molestias.
Re: consulta función en C
Posted:
Fri Feb 17, 2012 5:52 pm
by George
Lucas,
Con relacion al mensaje "access denied" debes verificar los permisos de acceso al folder donde esta el archivo que quieres borrar.
Windows 7 tiene un sistema de seguridad que bloquea este tipo de acciones (borrar archivos), a menos que les de los permisos adecuados.
Saludos,
George
Re: consulta función en C
Posted:
Wed Feb 22, 2012 4:35 pm
by lucasdebeltran
Biel,
Por favor, ¿cuando puedas puedes indicar cómo se haría lo de geterror() en c?.
Muchas gracias.
Re: consulta función en C
Posted:
Fri Feb 24, 2012 8:45 am
by Frafive
Hola
Tengo el mismo problema que Lucas, algunas veces no renombra el exe y el programa de actualización entra en un bucle.
Un saludo
Re: consulta función en C
Posted:
Fri Feb 24, 2012 1:20 pm
by Daniel Garcia-Gil
Hola
prueba de esta manera
- Code: Select all Expand view
#include "stdio.h"
#include "windows.h"
int main( int argc, char *argv[])
{
while( ! DeleteFile( argv[ 2 ] ) ){
Sleep( 700 );
if( GetLastError() == ERROR_FILE_NOT_FOUND )
break;
}
rename( argv[ 1 ], argv[ 2 ] );
WinExec( argv[ 2 ], 1 );
return EXIT_SUCCESS;
}
newver
<source> <destination>ese es el exe que yo uso... es muy pequeño en comparacion al que hace borland
http://www.danielgarciagil.com/fivewin/files/newver.zip
Re: consulta función en C
Posted:
Fri Feb 24, 2012 3:33 pm
by lucasdebeltran
Muchas gracias Daniel.
Me gustaría añadir un mensaje de texto.
¿Cómo sería en C MessageBox( 0, "ERROR: No puedo actualizar el programa "+argv[1], "Error", 0 ); ?
Es decir, no me deja añadir +argv[1]
Re: consulta función en C
Posted:
Fri Feb 24, 2012 4:05 pm
by Daniel Garcia-Gil
Lucas
agregado 2 parametros mas
la forma de usarse es:
newver <source> <destination> <iTimesToCheck> <cMessage>
<source> = nombre del archivo que sera renombrado
<destination> = nombre del nuevo archivo
<iTimesToCheck> = veces que ejecutara la operacion mietras se genere error
<cMessage> = mensaje personalizado de error
no lo he probado en tiempo real... solo ejecute esta funcion desde consola... verifica que el argumento <cMessage> talvez tengas que enviarlo entre comillas
ejemplo
- Code: Select all Expand view
WinExec( "newver.exe " + ::cFilename +".psh " + ::cFilename + ".exe" + " 5 " + " 'Mensaje personalizado' " )
- Code: Select all Expand view
#include "stdio.h"
#include "windows.h"
int main( int argc, char *argv[])
{
int iTimes = 0, i = 0;
char cMsg[ 512 ];
BOOL lRet;
iTimes = atoi( argv[ 3 ] );
while( ! ( lRet = DeleteFile( argv[ 2 ] ) ) ){
Sleep( 700 );
if( GetLastError() == ERROR_FILE_NOT_FOUND )
break;
i++;
if( iTimes != 0 && i > iTimes )
break;
}
if( lRet ){
rename( argv[ 1 ], argv[ 2 ] );
WinExec( argv[ 2 ], 1 );
}else {
if( strlen( argv[ 4 ] ) == 0 )
sprintf( cMsg, "%s", "No fue posible completar la operacion" );
else
sprintf( cMsg, "%s", argv[ 4 ] );
MessageBox( 0, cMsg, "Informacion", MB_ICONINFORMATION | MB_OK );
}
return EXIT_SUCCESS;
}